IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Casting d'un type de contrôle vers un autre


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 15
    Points : 21
    Points
    21
    Par défaut Casting d'un type de contrôle vers un autre
    Bonjour à tous,

    J'ai un blocage sur code que je n'arrive pas à régler, malgré quelques recherches dans des docs ou sur le net, j'aurais bien besoin d'un coup de main.

    Je vous explique en détail mon problème :
    - l'application est du type Windows avec des winforms et des composants tiers (Infragistics) pour les barres d'outils, grilles, saisie, ...
    - j'ai une classe dans laquelle j'ai une méthode qui doit parcourir tous les contrôles d'une feuille passée en paramètre
    - en fonction du type de contrôle j'ai différentes actions à faire (modifier le .text d'un textbox, remplir la liste d'un combo, ...), sans compter quelques actions à faire sur des contrôles ayant des noms spécifiques (fixés d'avance), sur lesquels je dois par exemple faire des modifs sur leurs propriétés .text ou changer leur tooltiptext
    - j'ai une variable (qu'on va appeler "champ") de type Control que j'utilise en parcourant les contrôles de la feuille (du genre champ = feuille.Controls[h])
    - accéder aux propriétés .text ou .tag ne pose pas de problème depuis la variable champ, mais lorsque je veux faire un casting vers un des composants tiers (du genre : tool = (UltraToolTipManager)feuille.Controls["toolTips"]), j'ai un message d'erreur "Impossible de convertir le type System.Windows.Forms.COntrol en Infragistics.Win.UltraWinToolTip.UlraToolTipManager"
    - du coup, je suis totalement bloqué pour accéder aux fonctionnalités de ces composants ...
    - je comprends que le casting est censé se faire uniquement d'un type hérité vers un type de base (de textbox vers control par exemple), même si je suis parfois surpris de voir l'inverse (du genre Label l = (Label)c; avec c définie comme Control), mais il n'y-a-t'il pas une solution à mon problème, d'extraire un contrôle et de le manipuler comme étant un type de contrôle précis ?...

    Voici un petit résumé de mon code (en gras la ligne à problème) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
                Control champ;
                UltraToolTipManager tool;
                UltraToolTipInfo tooltip;
                string chaine;
    
                champ = feuille.Controls["lblInfosEnregistrement"];
                champ.Text = "Nouvel enregistrement en cours.";
                chaine = champ.Tag.ToString();
                EcrireChamp(ref chaine, "Infos enregistrement", "Nouvel enregistrement en cours.");
                champ.Tag = chaine;
                tool = (UltraToolTipManager)feuille.Controls["toolTips"];
                tooltip = tool.GetUltraToolTip(champ);
                tooltip.ToolTipText = "Date de création/Date de modification";
    Merci d'avance pour tous qui pourront m'aider.

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Est-ce que ceci fonctionne ?

    tool = (feuille.Controls["toolTips"] as UltraToolTipManager);

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 15
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par popo Voir le message
    Est-ce que ceci fonctionne ?

    tool = (feuille.Controls["toolTips"] as UltraToolTipManager);
    Merci beaucoup, mais j'ai déjà essayé, j'ai exactement le même message d'erreur.

  4. #4
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    Par défaut
    Citation Envoyé par mister_rom Voir le message
    - je comprends que le casting est censé se faire uniquement d'un type hérité vers un type de base (de textbox vers control par exemple)
    Tu décris précisément un cas où l'on ne fait pas de cast (ou alors celui-ci est-il implicite).

    Un cast ça consiste à dire "j'ai un objet déclaré comme un A, mais je veux l'utiliser comme un B", ce qui peut signifier différentes choses selon le contexte. Il peut y avoir la création d'un nouvel objet, de façon fiable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int i = int.MaxValue;
    long l = i;
    avec risque de dépassement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    long l = long.MaxValue;
    int i = (int)l;
    d'incohérence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int i = int.Minvalue;
    uint ui = (uint)i;
    ou de perte de données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    float f = 1.2;
    int i = (int)f;
    Il peut s'agir d'un simple changement de "nomenclature"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    enum WeekDays { Monday, Tuesday, Wednesday, Thursday, Friday, Saterday, Sunday }
    int intValue = (int)WeekDays.Monday;
    ou de "perspective", par exemple avec l'héritage, ce qui peut marcher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Control c = new Form();
    Form f = (Form)c; // {c} est déclaré comme Control mais est en réalité une Form, ça passe
    ou pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Control c = new Label();
    Form f = (Form)c; // {c} est déclaré comme Control mais est en réalité un Label, pas une Form, ça casse
    Dans le cas présent nous avons un Form, qui hérite de Control une propriété Controls, qui une ControlCollection servant à stocker des Control (Object->MarshalByRefObject->Component->Control). Tu essaies d'obtenir de cette ControlCollection un UltraToolTipManager ; si on regarde la documentation d'Infragistics on obtient la hiérarchie suivante :
    Object->MarshalByRefObject->Component->UltraComponentBase->UltraStylableComponent->UltraToolTipManager.
    Comme on peut le voir UltraToolTipManager n'hérite pas de Control, ce n'est pas un Control, il n'a pas pu être ajouté directement à la ControlCollection et le compilateur lui-même peut te dire qu'on ne peut pas caster un Control en UltraToolTipManager.

    Il te reste à examiner comment les objets Infragistics sont ajoutés sur les Form et à en déduire comment tu peux les récupérer.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 15
    Points : 21
    Points
    21
    Par défaut
    Merci beaucoup Noxen pour les éclaircissements et les idées.
    Je vais creuser cette voie en fouillant dans la doc Infragistics, et je vous remonte à tous la suite.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 15
    Points : 21
    Points
    21
    Par défaut
    J'ai finalement trouvé la solution à mon problème.

    Comme disait Noxen, le casting que je voulais faire depuis la collection Controls, n'était pas possible du fait du composant UltraToolTipManager, qui n'est pas un contrôle (donc pas accessible dans la collection Controls de la feuille), mais plutôt un "component" comme tous les composants non-visuels (banques d'images, timer, ...).
    Par contre, le code automatique du design de la feuille, montre un objet "components", ayant pour rôle de contenir l'ensemble des composants non-visuels de la feuille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      /// Required designer variable.
      /// </summary>
      private System.ComponentModel.IContainer components = null;
    En fournissant cette variable à la méthode de ma classe, je peux enfin accéder à ma classe à mon objet UltraToolTipManager, qui est unique et dont le nom est standardisé, par le code suivant (la variable "composants" étant égale à "components") :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     tool = (UltraToolTipManager)composants.Components["toolTips"];
    Le code initial que j'avais publié devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
      Control champ;
      UltraToolTipManager tool;
      UltraToolTipInfo tooltip;
      string chaine;
    
      champ = feuille.Controls["lblInfosEnregistrement"]; 
      champ.Text = "Nouvel enregistrement en cours.";
      chaine = champ.Tag.ToString();
      EcrireChamp(ref chaine, "Infos enregistrement", "Nouvel enregistrement en cours.");
      champ.Tag = chaine;
            
      tool = (UltraToolTipManager)composants.Components["toolTips"];
    
      tooltip = tool.GetUltraToolTip(champ);
      tooltip.ToolTipText = "Date de création/Date de modification";
      tool.SetUltraToolTip(champ, tooltip);
    Merci encore pour l'aide fourni, je vais continuer à optimiser ce code.

    B.R

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [LibreOffice][Base de données] copier la valeur alphanumérique d'un champ de type "text(VARCHAR)" vers un autre du même type
    Par dinahlsg dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 12/06/2017, 09h18
  2. Réponses: 25
    Dernier message: 11/08/2010, 15h54
  3. Pointeur générique vers d'autres types d'objets
    Par LapinGarou dans le forum MFC
    Réponses: 11
    Dernier message: 15/09/2006, 16h48
  4. Réponses: 8
    Dernier message: 22/03/2006, 18h24
  5. [héritage] cast avec le type de base
    Par Lere dans le forum C++
    Réponses: 6
    Dernier message: 16/09/2004, 18h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo