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

Windows Forms Discussion :

[C#]Comment récupérer la propriété Enabled?


Sujet :

Windows Forms

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Par défaut [C#]Comment récupérer la propriété Enabled?
    Bonjour,

    Je voudrais savoir comment récupérer le choix que l'utilisateur a fait en mode design dans la propertygrid au sujet de la propriété Enabled?

    Je m'explique :

    Si j'ouvre un smartTag, ou que j'essaye d'afficher mon contrôle dans OnPaint avec un aspect dépendant de la valeur de Enabled, ça ne fonctionne pas, parce que this.Enabled renvoie toujours "true" lorsqu'on est en mode Design.

    Si par exemple j'ouvre simplement un SmartTag dans lequel je veux changer la propriété "Enabled" du contrôle, la case est toujours cochée même si je clique dessus, et cette case n'affecte ni la valeur de Enabled du propertyGrid, ni ne reflète le choix qu'à fait l'utilisateur dans ce propertygrid. Pareil si dans OnPaint je veux que mon contrôle s'affiche avec une couleur différente s'il est Disabled.

    Ou encore, si on surcharge la propriété Enabled et que dans le get on renvoie true ou false, ça n'a aucune action la propriété dans le propertygrid s'inverse de toutes façons à chaque clic (variable locale?).

    Merci,
    Claude

  2. #2
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Par défaut
    Salut
    -----

    Apparemment, il n'y a pas moyen.
    Du coup j'ai inversé le raisonnement en créant une variable locale "enabled" initialisée à "true" et ensuite surchargé la propriété "Enabled" en récupérant toute modification effectuée sur cette propriété et en la répercutant sur la variable locale avant de la renvoyer vers base.Enabled.

    Comme ça, on peut accéder à Enabled en mode design à partir de plusieurs endroits, et réaliser le dessin du contrôle dépendant du choix de l'utilisateur.

    MAIS en fait ça ne fonctionne pas. En effet, si dans le smartTag la modification de la propriété Enabled change bien l'aspect du contrôle, affecte bien la nouvelle valeur à la variable locale "enabled" et donc à base.Enabled, par contre ça n'a absolument aucun impact sur la propertyGrid.
    Et, réciproquement, la modification de Enabled dans la propertyGrid n'agit en rien sur ma propriété surchargée.

    Du reste, si j'écris ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public new bool Enabled
    { get { return false; } set{...}}
    La propertygrid de VS n'en a cure, il continue de m'afficher "true" par défaut, qui s'inverse à false lors de la première modification.

    Apparemment, cette propertygrid utilise sa propre gestion interne de la propriété, et se moque complètement d'une éventuelle surcharge faite par l'utilisateur (ce qui rend dès lors impossible le fonctionnement d'un smartTag sur cette propriété). Ca ne me semble pas très "objet" comme méthode.

    Si quelqu'un a une idée, je suis preneur.
    Je rappelle que je cherche :

    1) A avoir dans mon smartTag pour la propriété "Enabled" la même valeur que celle renseignée dans le propertygrid

    2) A pouvoir dans ma méthode "OnPaint" connaître la valeur assignée à Enabled dans cette propertyGrid.

    merci,
    Claude

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    lu en diagonale, mais au lieu de penser que c'est pas faisable faut me demander

    essaye this.site.enabled (casté site sur le type de this peut etre)
    en mode design, une autre instance est utilisé par VS, placée dans site (théorie vu ce que j'ai pu voir)
    ou sinon via un property.getvalue (syntaxe compliquée donc essaye d'abord site)

    d'ailleurs dans tes smarttag, tu tapes directement les propriétés ou tu passes par le propertydescriptor ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Par défaut
    mais au lieu de penser que c'est pas faisable faut me demander
    Ben, j'ai demandé puisque j'ai posté,
    Plus sérieusement, j'évite d'interpeller personnellement des interlocuteurs sur un forum, parce que ça risque d'agacer celui qu'on interpelle ainsi que de décourager ceux qu'on n'a pas interpellé de répondre

    Note que j'ai contourné le problème, je me suis passé de cette fonctionnalité. Donc maintenant c'est plus pour comprendre le pourquoi que pour me débloquer, inutile de te casser la tête on pourra toujours y revenir plus tard si ça s'avère nécessaire

    en mode design, une autre instance est utilisé par VS, placée dans site (théorie vu ce que j'ai pu voir)
    Ce que je comprends mal, c'est pourquoi ça fonctionne avec n'importe quelle autre propriété, sauf Enabled. A moins que ça provienne de l'attribut [DispId(-514)] dont on a décoré l'attribut "Enabled" de la classe "Control" ?


    essaye this.site.enabled (casté site sur le type de this peut etre)
    Site.Enabled n'existe pas.
    Si je caste Site sur le contrôle, j'obtiens null
    Si je caste Site.Component sur le contrôle, j'obtiens le contrôle, mais j'obtiens également strictement le même fonctionnement.

    d'ailleurs dans tes smarttag, tu tapes directement les propriétés ou tu passes par le propertydescriptor ?
    Je tape mes propriétés. Pourquoi ce n'est pas la bonne méthode?

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    quand je disais de me demander c'était plus une blague oui ... j'envoie ch*** les gens aussi en général , éventuellement j'accepte les liens vers les topic, étant vb.netiste, je passe pas tous les jours chez les c#iens


    dans un smarttag, si tu modifies directement la propriété, normalement visual studio n'est pas averti de la modification de la valeur, donc il ne place pas l'étoile à coté du nom du fichier qu'il signifie qu'il y a une modif à enregistrer et donc il ne regénère pas le fichier designer

    déplacer ensuite un controle permet de rajouter l'étoile et de regénérer le designer avec les bonnes valeurs quand meme

    tu n'as pas ce comportement et j'aurais rêvé ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Par défaut
    dans un smarttag, si tu modifies directement la propriété, normalement visual studio n'est pas averti de la modification de la valeur, donc il ne place pas l'étoile à coté du nom du fichier qu'il signifie qu'il y a une modif à enregistrer et donc il ne regénère pas le fichier designer
    Ah ben oui, mince alors

    Je suis en train d'ajouter des SmartTags à tous mes contrôles et je n'avais pas fait attention à ça. J'avais vérifié qu'un changement de propriété dans le smartTag se répercutait bien sur la propertyGrid de VS, mais je n'avais pas vu que par contre l'étoile ne s'affichait pas.

    Du coup, effectivement, si je modifie la propriété d'un contrôle via le smartTag puis que je tape <F5>, la modification n'est pas prise en compte car le .designer.cs n'a pas été regénéré.

    Merci pour les nombreux tutoriaux qui font tous l'impasse là-dessus, LOL

    Note au passage que lorsque tu dérives d'un contrôle existant, puisque tu ne peux pas dériver du designer de ce contrôle (puisque internal), ben tu dois créer un nouveau designer et donc perdre (et donc recommencer) tout ce qu'il y avait dans le designer orignal (dont les snaplines). Ca non plus les tutoriaux n'en parlent pas, ils disent juste "Les SmartTag, c'est "fastoche".
    Plus on creuse sur le sujet des contrôles, plus on trouve matière à creuser :

    c'est ultra-simple d'en créer mais beaucoup plus compliqué de les doter de fonctionnalités "pro".

    Sinon, tu peux me donner une piste pour savoir comment je dois travailler avec le propertydescriptor? (je vais quand même chercher par moi-même en attendant).

  7. #7
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    pour le get, retourner la valeur de la propriété directement ne pose à priori pas de soucis

    pour le set par contre voici le code (en vb.net, peut etre des ( à transformer en [, et DirectCast en c# c'est juste (Type) devant je crois) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.ComponentModel.TypeDescriptor.GetProperties(instance)("nom_de_la_propriété").SetValue(instance, value)
    en passant par là, VS est au courant de la modif sur la propriété

    avec un .GetValue sur le TypeDescriptor, tu dois pouvoir choper la vraie valeur de Enabled (à tester)


    quand c'est actionitem (lien) en général je modifie les propriétés directement dans les fenetres qui s'ouvre, et après je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DirectCast(instance.Site.GetService(GetType(System.ComponentModel.Design.IComponentChangeService)), System.ComponentModel.Design.IComponentChangeService).OnComponentChanged(instance, Nothing, Nothing, Nothing)
    ceci sert à dire à VS que l'instance a changé (sans lui spécifier quoi et la nouvelle valeur, mais il rajoute l'étoile)



    et dès l'intant qu'il y a l'étoile, VS resérialise tout le fichier designer de toute facon
    et il me semble que la sérialisation du fichier designer est codée en .net aussi (tu en parlais sur un autre topic)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Par défaut
    Bon, j'ai testé les deux méthodes.
    La première donne ceci en C :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TypeDescriptor.GetProperties(bg)["ReadOnly"].SetValue(bg, value);
    avec bg = nom de l'instance et "ReadOnly" le nom de ma propriété de test.

    Résultat , la propriété est affectée correctement ET l'étoile est générée.

    La seconde donne ceci (là, j'ai eu un peu de mal, je cherchais après DirectCast dans les classes de Framework, je n'avais pas compris qu'il s'agissait d'une instruction VB.NET )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (bg.Site.GetService(typeof(IComponentChangeService)) as IComponentChangeService).OnComponentChanged(bg, null, null, null);
    Pareil: résultat

    Note au passage qu'avec ma chance habituelle, le premier test que j'ai fait montrait un bug. Il ne s'agissait ni d'un bug de ta méthode ni de mon contrôle, mais d'un bug du TextBox dont j'avais dérivé. En fait, ma couleur de fond ne se modifiait pas uniformément.
    Pour voir ce bug, c'est simple : tu places un TextBox sur une form.
    Puis tu affectes un texte quelconque à la propriété "Text".
    Ensuite, sans avoir rien modifié d'autre, tu places la propriété "BackColor" sur la valeur "HotTrack". Amusant, non?
    Et si on n'affecte pas explicitement une couleur de fond dans le constructeur d'un contrôle dérivé on obtient le même comportement pour n'importe quelle couleur de fond la première fois qu'on la modifie dynamiquement, ensuite ça refonctionne normalement.

    Donc, merci pour les deux tuyaux, je vais remodifier tous mes SmartTags.

    Pour Enabled :

    Avec le Get, ça fonctionne, effectivement
    Et pour le set, ça fonctionne SEULEMENT si on utilise le propertyDescriptor également, sinon c'est sans effet (logique).

    Donc : question initiale résolue, et effectivement j'aurais du te demander avant de dire que ce n'était pas possible


    Note que pour cette propriété, si on remonte à la source, on lui trouve un attribut spécifique [dpsIp(-514)], qui doit expliquer son comportement particulier à mon avis.

    et il me semble que la sérialisation du fichier designer est codée en .net aussi (tu en parlais sur un autre topic)
    Oui, c'est lié au TypeConverter.
    J'ai réussi par exemple à faire utiliser par le designer un constructeur particulier avec paramètres plutôt que ses méthodes par défaut.
    Un bon exemple est montré dans le PointConverter de la structure Point.
    En remontant la hiérarchie on peut en fait apparemment imposer les syntaxes d'écriture du Designer.

    J'ai d'autres questions, MAIS ne réponds que si tu as le temps et que ça ne t'ennuie pas (évidemment tout qui veut répondre aussi est le bienvenu)

    Je pose toujours, fais comme tu le sens :

    J'ai examiné les designers "d'origine", et par exemple le TextBoxDesigner.
    Et j'ai trouvé que pour certaines propriétés particulières on avait une méthodologie curieuse. Exemple, pour PasswordChar, on trouve ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    protected override void PreFilterProperties(IDictionary properties)
        {
            base.PreFilterProperties(properties);
            string[] strArray = new string[] { "PasswordChar" };
            Attribute[] attributes = new Attribute[0];
            for (int i = 0; i < strArray.Length; i++)
            {
                PropertyDescriptor oldPropertyDescriptor = (PropertyDescriptor) properties[strArray[i]];
                if (oldPropertyDescriptor != null)
                {
                    properties[strArray[i]] = TypeDescriptor.CreateProperty(typeof(TextBoxDesigner), oldPropertyDescriptor, attributes);
                }
            }
        }
    Outre le fait que manifestement c'est créé avec un générateur de code (vu que c'est prévu pour plusieurs propriétés et qu'ici on n'en a qu'une), j'ai tenté de comprendre ce que ce code faisait, et ma conclusion a été qu'en fait ça enlevait tous les attributs éventuels de la propriété "PasswordChar".

    Le problème, en fait, c'est que ça ne semble enlever rien du tout en pratique, et que si je tente pareil avec une autre propriété de mon contrôle, ça n'a strictement aucun effet apparent. Donc : je ne comprends pas l'utilité de ce code.

    Ensuite, joint à ça, on trouve la redéclaration de la propriété PasswordChar dans le designer lui-mê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
    15
    16
    17
    18
    19
    20
     private char PasswordChar
        {
            get
            {
                TextBox control = this.Control as TextBox;
                if (control.UseSystemPasswordChar)
                {
                    control.UseSystemPasswordChar = false;
                    char passwordChar = control.PasswordChar;
                    control.UseSystemPasswordChar = true;
                    return passwordChar;
                }
                return control.PasswordChar;
            }
            set
            {
                TextBox control = this.Control as TextBox;
                control.PasswordChar = value;
            }
        }
    Et là, je comprends encore moins l'utilité de cette propriété privée ??
    De nouveau, j'ai tenté de faire pareil dans mon propre designer, mais de nouveau strictement sans aucun effet.

    Je bute là-dessus, parce que vu que je dérive de ControlDesigner, j'ai peur d'oublier quelque chose d'important en créant mes propre designers.
    Il ne s'agirait pas de détériorer quelque chose qui fonctionne en voulant simplement ajouter la fonctionnalité des SmartTags.

    Merci

Discussions similaires

  1. Comment récupérer une propriété du profil
    Par knuth33 dans le forum Développement Sharepoint
    Réponses: 14
    Dernier message: 23/08/2011, 15h49
  2. Réponses: 1
    Dernier message: 08/11/2010, 12h24
  3. Comment récupérer les propriétés d'un fichier en JS ?
    Par Zebulon777 dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 08/10/2010, 13h37
  4. Comment récupérer la propriété IsChecked d'une CheckBox définie en DataTemplate ?
    Par WebPac dans le forum Windows Presentation Foundation
    Réponses: 19
    Dernier message: 20/01/2010, 16h23
  5. [Type "var"] Comment récupérer les propriétés de l'objet ?
    Par Firedeal dans le forum Framework .NET
    Réponses: 7
    Dernier message: 31/07/2008, 23h57

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