none
Comment ajouter a un control par defauts une propriété ? RRS feed

  • Question

  • Bonjour a tous,

    J'ai recherché vaguement sur le net comment faire pour ajouter une propriété a un contrôle (voir tout les contrôles) j'ai rien trouvé pour l'instant !
    Effectivement, il y a la personnalisation de contrôle a la conception, ou il peut hérité des même propriété du contrôle courant.

    j'aimerais donc ajouté directement des propriétés par défaut a tout les contrôles, mais j'ai pas trouver encore comment faire ...
    Avez vous une piste ?

    En vous remerciant d'avance.

    A bientôt.


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    jeudi 11 août 2011 08:33
    Auteur de réponse

Réponses

  • Personnellement je ferais donc qq chose comme :
    - une classe qui expose les données qui m'intéressent
    - cette classe peut persister tout ou partie de ses propriétés vers un fichier XML (cf XmlSerializer)
    - les contrôles d'un formulaire sont liées aux propriétés de cette classe (voir http://msdn.microsoft.com/fr-fr/library/sw223a62(v=VS.100).aspx), il s'agit donc de définir la propriété DataBindings déjà présente dans le concepteur

    Cela créera un composant BindingSource dont la propriété DataSource sera l'instance qui fournit les données à afficher.

    Par exemple dans un projet de test ajouter une classe :

     

    Public Class Data
     Public Property A As String
     Public Property B As String
     Public Property C As String
     Public Property D As String
    End Class
    
    Dans les propriétés DataBindings choisir une source "Objet" et sélectionner la classe Data. Pour chaucune de 4 textbox sélectionner respectivement les propriétés A, B, C, D sous DataBindings, Text dans le concepteur de formulaire.

     

    Au chargement du formulaire :

     

      Dim d As New Data With {.A = "A", .B = "B", .C = "C", .D = "D"}
      d.A = "A"
      d.B = "B"
      DataBindingSource.DataSource = d
    

    Et donc à l'exécution les textbox vont bien afficher A, B, C, D et les saisies vont être répercutées automatiquement dans la classe.

     

    C'est ensuite cette classe qui va enregistrer les propriétés voulues dans un fichier XML. Cela permet de réutiliser le mécanisme de DataBinding déjà présent dans .NET y compris dans ce cas de figure plutôt que d'avoir à créer un mécanisme particulier (qui effectivement, si on veut que cela soit exploitable dans le concepteur, nécessite soit de créer une version spéciale de tous les contrôles soit peut-être de changer la façon dont les types sont décrits ce qui ne sera pas non plus très facile ou logique, également en terme d'architecture les contrôles non plus besoin de savoir comment les données sont sauvegardées ni même si elles sont sauvegardées).

    Je ne sais pas comment est géré actuellement la sauvegarde en Xml mais là aussi il existe déjà des mécanismes proposés par .NET : voir éventuellement http://msdn.microsoft.com/fr-fr/library/ms233843.aspx  "Sérialisation (C# et VB)", mécanisme personnalisable qui doit permettre éventuellement de ne pas sauver certaines propriétés ou de crypter une propriété en particulier.

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    mardi 16 août 2011 19:31
    Modérateur

Toutes les réponses

  • Bonjour Xavier,

    Microsoft a pensé à cela en ajoutant la propriété TAG à tous les controles et c'est cette propriété qui peut servir au cas ou on voudrait renseigner une info supplémentaire

    Sinon il te suffit de surcharger un control et d'ajouter une ou plusieurs propriétés

     

     


    fred
    jeudi 11 août 2011 17:46
  • Bonjour Fred,

    La propriété TAG ne me permet pas de faire ce que je souhaiterais.
    Auriez vous un exemple sur le "surchargement"

    Je souhaiterais faire une class qui ajouterai une propriété a tout les controles existant dans la/les form(s), par exemple une propriété toto qui pourrais prendre True ou False

     

    A bientôt


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    jeudi 11 août 2011 19:26
    Auteur de réponse
  • Bonsoir Xavier,

    Le moyen le plus direct et simple est de créer des contrôles hérités avec l'ajout de la propriété concernée, puis des les ajouter au formulaire.

    Bonne soirée. :)

     


    N'hésitez pas à poser des questions si un problème subsiste ou quelque chose n'est pas clair. Dans l'autre cas, veuillez indiquer que le problème est résolu. Cordialement - Best Regards. Contact
    jeudi 11 août 2011 21:26
  • Bonjour Michel K,

    Effectivement c'est ce que j'ai fait pour un contrôle, mais ce que j'aimerais, c'est de le faire pour tout les controles et que cette propriété soit par défaut
    Je pourrais effectivement le faire pour chacun des contrôles qui existe par défaut dans la barre d'outil et remplacer les contrôle au fur a mesure ce qui me permettra d'avoir une barre d'outils comme je veux. Mais avant de faire tout ça je me demandais, justement, si on ne pouvais pas faire une class ou on pouvais faire ce genre de chose et sans passé par le développement de chaque controle.

     


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    vendredi 12 août 2011 07:20
    Auteur de réponse
  • Bonjour,

    Pourquoi non ? Cela permettrait de stocker l'info supplémentaire (cela peut-être un objet). Eventuellement une méthode d'extension pourrait permettre de manipuler l'info de façon plus spécifique.

    Egalement il peut être aussi utile d'expliquer le but général ce qui pourrait permettre de faire des suggestions plus précises.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    dimanche 14 août 2011 20:25
    Modérateur
  • Patrice,

    Le but de pouvoir faire une seul class par défaut pour tout les contrôles c'est justement pour évité du code a répétition.
    Le fais de pouvoir faire des contrôle personnaliser c'est bien (voir très utilise) mais je trouve de pouvoir ajouté des fonctionnalité a l'existant c'est bien aussi. :P

    Exemple de ce que j'aimerais faire :
    Pour pouvoir, par exemple, faire une application portable. l'idée serait d'ajouté deux propriétés a chaque contrôle
    une qui s’appellerait par exemple : BackupToXML (True or False) et l'autre BackupPathName (c:\toto.xml) (global)

    Le fait de mettre la propriété a true au niveau du contrôle cela permettra de faire une sauvegarde du contrôle dans le le fichier XML
    La sauvegarde pourrait être par exemple pour un TextBox, ou une ListBox, ou un Label tout ce qui est de donnée Text

    Le fichier XML pourrais avoir un aspect comme :

    <root><TextBox1 Text="toto"/><Label1 Text="Titi" /><ListBox1 Items="tata;toto;tyty;coco;kiwi" /></roo>
    


    J'ai deja fait une routine qui permet de faire tout ça, mais ce que j'aimerais c'est que ça soit fait au niveau du controle et plus en code ...

     


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    dimanche 14 août 2011 21:26
    Auteur de réponse
  • Bonjour Xavier,

    C'est très ambitieux comme projet, dans ce cas il faudrait définir une classe qui dérive d'object et qui surcharge chaque contrôle avec tes deux membres supplémentaires

     


    fred
    lundi 15 août 2011 12:22
  • On est bien en Windows Forms ? Sinon WPF propose déjà un langage de balisage. Je ne vois pas non plus très bien l'objectif général de sauvegarde de ces contrôles dans un fichier Xml (et tous les contrôles ne vont pas dans le même fichier ?).
    En le faisant donc directement cela pourrait donner qq chose comme (en utilisant donc la propriété Tag comme suggéré par fred75 et une méthode d'extension pour faciliter son usage) :
    Imports System.Runtime.CompilerServices
    
    Module XmlExtension
     Class XmlSettings
      Public Property Backup As Boolean
      Public Property Path As String
     End Class
     <Extension()> Public Function Xml(ByVal c As Control) As XmlSettings
      If c.Tag Is Nothing Then c.Tag = New XmlSettings
      Return CType(c.Tag, XmlSettings)
     End Function
    End Module
    

    Exemple d'utilisation :
      Button2.Xml.Backup = True
      Button2.Xml.Path = "c:\Toto"
      TextBox1.Xml.Path = "c`\titi"
      MessageBox.Show(TextBox1.Xml.Backup.ToString)
    

    Personnellement je ferais probablement plutôt une classe générale assurant cette persistance Xml, les contrôles étant enregistrés dans cette classe pour être persistés.
    A moins que l'on veuille aussi pouvoir utiliser ces propriétés en mode conception ?
    Pour le "but général" je pensais plutôt à une explication en dehors de toute considération technique  style "le but est de pouvoir traduire l'interface en d'autres langues" par exemple (cela ressemble à un besoin de traduction, c'est ce que vous voulez dire par "portable" ?).
    Cela permet parfois de suggérer une toute autre approche pour résoudre un problème plutôt que de travailler sur juste un point technique particulier à l'approche déjà choisie pour résoudre le problème.
    Par exemple si c'est bien un problème de localisation de l'interface, il serait peut-être intéressant de voir ce que propose .NET si vous n'avez pas déjà creusé le sujet d'autant plus que la localisation doit-être assez personnalisable (si par exemple vous voulez que les traductions soient dans des fichiers ou une base de données pour permettre une localisation immédiate par n'importe qui, je pense que cela doit être faisable .NET utilisant généralement des "fournisseurs" remplaçables permettant de personnaliser le comportement de tel ou tel aspect).

    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    lundi 15 août 2011 12:57
    Modérateur
  • Bonjour Patrice,

    Une application portable est une application qui s'ajoute, par exemple, dans une clef USB pour pouvoir l’exécuter sur n'importe quelle machine.
    Il est, aussi, possible de prendre le fichier de configuration (le fichier XML) et le partager ...

    Le code que vous avez proposé est pas mal en soit et je ne savais pas a quoi servais la propriété TAG :)
    La propriété path devrais être identique pour tout les contrôles, cela n'est pas tres important pour l'instant...

    Oui, j'aimerais bien que ses propriétés soit en mode conception (quand je parlais de modification de contrôle existant cela voulais dire en mode conception)

    Cela pourrais effectivement servir de traduction d'application mais cela n'est pas pour l'instant le but que je recherche

    Dans la réalisation que je souhaiterai
    c'est la possibilité d'ajouté deux propriétés a l'existant en mode conception
    -> Une des deux propriété doit être général, c'est a dire que la propriété "Path" doit être le même pour tout les contrôles.
    -> être l'autre propriété qui doit être personnel au controle, par exemple pour un "button1" propriété BackupToXML = true et pour les autres contrôle = False (toujours en mode conception)

    C'est peut être pas possible de faire ce genre de chose, et la seul possibilité serait de passé par la personnalisation de contrôle (un par un) affin d'y parvenir.
    si c'est trop prise de tete a faire, je vais rester avec ma routine qui est fonctionnel mais super au niveau "aisance d'utilisation" comparé au mode conception.



    Merci encore pour vos aide

    A bientôt

     


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    mardi 16 août 2011 08:02
    Auteur de réponse
  • Ok mais je ne vois toujours pas le rapport entre le fait d'avoir une application utilisable depuis une clé USB et le but général de ce fichier XML.

    Sit le but est de stocker directement sur la clé USB les données saisies dans l'application, il serait sans doute possible d'utiliser le "databinding" vers un dataset sauvé au format XML voire même d'utiliser une base de données fichier comme SQL Server Compact qui ne nécessite qu'une référence vers une DLL pour fonctionner...

    Pour l'instant j'ai l'impression que l'on cherche en gros à faire du "databinding" vers un fichier de données (ce qui est déjà prévu via la propriété DataBindings des contrôles) ?

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    mardi 16 août 2011 13:33
    Modérateur
  •  

    Oui, le but est de faire une sauvegarde, pas en données comme on pourrais y stoker des noms, premons, anniversaire, etc ... , mais de champs text de plusieurs contrôle qui ce trouve dans le formulaire Windows Form
    par exemple j'aimerais faire une sauvegarde des champs "Path (UNC)", Domain, User, et Password (avec cryptage) pour éviter de se le tapé a chaque fois quand l'application est exécuter a nouveau.

    le code en soit existe déjà en code puisque j'ai déjà fait ce genre de chose par une petite routine, je souhaiterais simplement savoir comment on fait pour ajouté une propriété a l'existant si c'est possible (puisque mon but est de choisir si oui ou non je veux faire la sauv du contrôle dans mon fichier XML depuis le concepteur).

    je sais pas si j'ai été clair alors je vais donner un exemple depuis mon idée :

    j'ai un formulaire ou j'aurais cette fonctionnalité de sauv dans un fichier XML dans le chemin désiré (path)
    je lui ajoute 5 Textbox, 3 button, une listbox

    Les propriétés des 5 Textbox ...
    Textbox1 :
    BackupToXML = True
    BackupPathName = "C:\dossier" 'Les autres controle obtiendrons automatiquement la même valeur

    Textbox2 :
    BackupToXML = True

    Textbox3:
    BackupToXML = False

    Textbox4
    BackupToXML = True

    Textbox :
    BackupToXML = False

    Les trois buttons
    BackupToXML = False

    Vu que la fonctionnalité est la même partout dans tout les contrôles il reste a choisir si oui ou non on veux le sauv dans un fichier XML


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    mardi 16 août 2011 14:02
    Auteur de réponse
  • Bonjour,

     

    Le problème que tu soulève peut relever du pattern Décorateur.

     

    Sinon as tu pensé à utiliser une solution semblable à la classe Nullable<T> qui permet d'associer une valeur null à des instances de type valeur.

    Voici un exemple de code qui pourrait te guider si tu pense que cette piste peut être bonne :

    public class ExtendedControl<T> where T : Control

        {

            public T Control

            {

                get;

                set;

            }

     

            //Exemple d'ajout d'une properiété de type int

            public int MyProperty

            {

                get;

                set;

            }

        }

     

    Remarque : le code fourni n'est qu'une squelette de ce qui pourrait être un début de la solution.


    mardi 16 août 2011 15:23
    Auteur de réponse
  • Personnellement je ferais donc qq chose comme :
    - une classe qui expose les données qui m'intéressent
    - cette classe peut persister tout ou partie de ses propriétés vers un fichier XML (cf XmlSerializer)
    - les contrôles d'un formulaire sont liées aux propriétés de cette classe (voir http://msdn.microsoft.com/fr-fr/library/sw223a62(v=VS.100).aspx), il s'agit donc de définir la propriété DataBindings déjà présente dans le concepteur

    Cela créera un composant BindingSource dont la propriété DataSource sera l'instance qui fournit les données à afficher.

    Par exemple dans un projet de test ajouter une classe :

     

    Public Class Data
     Public Property A As String
     Public Property B As String
     Public Property C As String
     Public Property D As String
    End Class
    
    Dans les propriétés DataBindings choisir une source "Objet" et sélectionner la classe Data. Pour chaucune de 4 textbox sélectionner respectivement les propriétés A, B, C, D sous DataBindings, Text dans le concepteur de formulaire.

     

    Au chargement du formulaire :

     

      Dim d As New Data With {.A = "A", .B = "B", .C = "C", .D = "D"}
      d.A = "A"
      d.B = "B"
      DataBindingSource.DataSource = d
    

    Et donc à l'exécution les textbox vont bien afficher A, B, C, D et les saisies vont être répercutées automatiquement dans la classe.

     

    C'est ensuite cette classe qui va enregistrer les propriétés voulues dans un fichier XML. Cela permet de réutiliser le mécanisme de DataBinding déjà présent dans .NET y compris dans ce cas de figure plutôt que d'avoir à créer un mécanisme particulier (qui effectivement, si on veut que cela soit exploitable dans le concepteur, nécessite soit de créer une version spéciale de tous les contrôles soit peut-être de changer la façon dont les types sont décrits ce qui ne sera pas non plus très facile ou logique, également en terme d'architecture les contrôles non plus besoin de savoir comment les données sont sauvegardées ni même si elles sont sauvegardées).

    Je ne sais pas comment est géré actuellement la sauvegarde en Xml mais là aussi il existe déjà des mécanismes proposés par .NET : voir éventuellement http://msdn.microsoft.com/fr-fr/library/ms233843.aspx  "Sérialisation (C# et VB)", mécanisme personnalisable qui doit permettre éventuellement de ne pas sauver certaines propriétés ou de crypter une propriété en particulier.

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    mardi 16 août 2011 19:31
    Modérateur
  • Bonjour du jour eouldmourad et Patrice Scribe :)

    @Patrice Scribe,

    j'ai jamais fait de chose comme ça auparavant donc ça va être un début difficile pour moi
    Votre idée semble être une bonne idée mais je ne comprend pas la partie "DataBindingSource.DataSource" ou je trouve DataBindingSource ?
    J'ai regardé le premier lien qui est "Comment : créer un contrôle à liaison simple dans un Windows Form"
    En point 1 cela parle de ce connecter a une base de donner, mais je pense que c'est pas forcement une obligation !?

    donc j'ai fais comme le tuto qui ce trouve dans le lien a l’exception de la connexion ou j'ai fait "objet" et j'ai coché tout le projet ...
    et effectivement je pense qu'en sélectionnant la/les propriété(s) souhaiter on pourrais en sortir un XML comme vous l'avez dit, donc c'est une tres bonne solution de contournement
    j'ai donc fait Form1BindingSource.DataSource = d / mais le code ne fait pas grand chose ... (je doit me trompé, je ne sais ou encore)
    (je connaissais pas le fonctionnement de cette propriété)

    Une petite information quand on fait ce genre de manipulation, quand on regarde la propriété Text de form1 on a une icône disant qu'il y a un BindingSource dessus, certainement pour dire que cette manip a bien été réaliser (peut être que dans la version 2010 de VS)

    @eouldmourad,

    J'ai pas encore essayer, car je ne connais suffisamment le C#, je vais donc retranscrire votre code en VB.net par un outils de convertion et essayer de voir ce que ça donne

    merci encore

     

    A bientot

     


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    mercredi 17 août 2011 08:55
    Auteur de réponse
  • @eouldmourad,

    Après avoir testé votre proposition de code cela n'ajoute pas de propriété dans la partie concepteur (Desing)
    ou alors je n'ai pas réussi a faire correctement la chose ? :)

     

    A bientot


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    mercredi 17 août 2011 09:14
    Auteur de réponse
  • Une fois que l'on a choisi pour la première la source de données, on doit avoir un composant qui apparait (dans un bandeau en bas du concepteur Windows Forms). La source s'appelle <Nom de la classe choisie>BindingSource (donc DataBindingSource si la classe choisie s'appelle Data).

    <Classe choisie>BindingSource.DataSource=<Instance de la classe choisie> permet de définir la source de données effectivement. La "BindingSource" agit comme un intermédiaire entre la source de données et le formulaire (ce qui permet d'intervenir pour par exemple formater ou convertir les données si besoin, on encore gérer le déplacement dans les données si la source est une liste).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    mercredi 17 août 2011 16:47
    Modérateur
  •  

    C'est pas trop ce que je recherchais a la base mais cela va faire l'affaire pour l'instant :)

    Merci


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    jeudi 18 août 2011 07:10
    Auteur de réponse
  • Sinon le nom du fichier étant commun à tous les contrôles, inutile de le saisir au niveau de chaque contrôle au niveau du concepteur, il serait à définir une seule fois dans le code par exemple.

    Ne resterait donc qu'à définir au niveau de chaque contrôle, un simple booléean qui pourrait être saisi via la propriété Tag accessible déjà via le concepteur Windows Forms, quitte à utiliser une méthode d'extension pour faciliter un peu son usage comme montré précédemment (par exemple retourner Not IsNothing(c.Tag) sous forme d'une fonction d'extension PersistToXml, on ne se préoccupe donc de savoir que si oui on non la propriété tag a été définie sans même se soucier de la valeur exacte saisie. Cela permettrait peut-être d'obtenir le résultat de la façon dont vous le vouliez.

    Mon but était plutôt d'attirer l'attention sur les mécanismes habituels proposés par .NET (qui ne sont pas toujours bien connus) avant de créer qq chose d'autre si vraiment ils ne conviennent pas.

     

     

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    jeudi 18 août 2011 12:11
    Modérateur
  • Merci pour les précisions :)

    je vais essayer d'exploité les fonctionnalités avec toutes les choses que vous m'avez montré (appris)

    Merci d'avoir persisté sur la chose c'est très intéressant  :P

     

    A bientot


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    jeudi 18 août 2011 20:27
    Auteur de réponse