Re Propriété (pas si simple)

Signaler
Messages postés
723
Date d'inscription
dimanche 26 novembre 2006
Statut
Membre
Dernière intervention
23 janvier 2013
-
Messages postés
723
Date d'inscription
dimanche 26 novembre 2006
Statut
Membre
Dernière intervention
23 janvier 2013
-
Re bonjour !

J'ai de nouveau une petite question.
Toujours avec le même code :
J'ai créer un code qui permet de donné une valeur à une propriété quelque soit le type de propriété et de contrôle.

Mais bon, "quelque soit le type de propriété", pas vraiment...
En effet, ici par exemple (j'ai pas mit toute la fonction), on peu définir la valeur d'une propriété de type boolean à n'importe quel contrôle....

            For Each a As System.ComponentModel.IComponent In Composant
                If DirectCast(a, Control).Name = Ctrl Then
                    Select Case DirectCast(a, Control).GetType.GetProperty(Nom).PropertyType.Name
                        Case "Boolean"
                            DirectCast(a, Control).GetType.GetProperty(Nom).SetValue(a, CBool(Valeur), Nothing)
                    End Select
                End If
            Next

Jusque là facile, mais si je m'y prend comme ça, je vais avoir 3 kilomètre de code pour mettre la même chose pour String, Integer, Image, Color, et sans compté les type du style FlatStyle, FormBorderStyle...etc et sans compté aussi la possibilité que des contrôle personnalisé possèdes leur propre type....

Et oui, faut pas oublier tout ça.

Donc ma question est la suivante :

Comment je pourrais faire pour donner une valeur à une propriété quelque soit le type (et en sachant la variable Valeur est String) ???

Merci

 
*** ebaudoux@club.fr ***
*** http://www.velersoftware.fr.nf/ ***

5 réponses

Messages postés
723
Date d'inscription
dimanche 26 novembre 2006
Statut
Membre
Dernière intervention
23 janvier 2013
2
Bon, ça va, j'avance

J'ai réussit à faire ce que je voulais, grâce au code suivant :

Dim tip As System.ComponentModel.TypeConverter
Dim prop As System.ComponentModel.PropertyDescriptor
Dim obj As Object
Dim isCollection As Boolean

For Each a As System.ComponentModel.IComponent In Composant
                If DirectCast(a, Control).Name = Ctrl Then
                        prop = System.ComponentModel.TypeDescriptor.GetProperties(a)(Nom)
                        tip = prop.Converter
                        isCollection = prop.Attributes.Contains(System.ComponentModel.DesignerSerializationVisibilityAttribute.Content)
                        If isCollection Then
                            DirectCast(a, ComboBox).Items.Add(Valeur)
                        Else
                            obj = tip.ConvertFromInvariantString(Valeur)
                            prop.SetValue(a, obj)
                        End If
                End If
Next

Explication :
- On charge la propriété
- On cherche un convertisseur de donné String vers n'importe quoi
- Si on a affaire à une collection (pour une propriété items par exemple), on ajoute l'item (pas terminé ici, j'ai fait un test avec un combobox)
- Sinon, et bien on convertit la valeur string en propriété et on l'affecte au contrôle

Si par hasard la solution pour les Collections vous saute aux yeux, c'est avec plaisir, car je sent que je vais encore galérer, lol

@+++

 
*** ebaudoux@club.fr ***
*** http://www.velersoftware.fr.nf/ ***
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
Bonjour,

Je ne sais pas si cela va t'aider, mais ton pb est similaire à celui que j'avais... Voici une demie-solution : http://www.vbfrance.com/codes/METTRE-VALEUR-ENSEMBLE-CONTROLES-MEME-TYPE_47925.aspx 
Je dis "demi" car j'utilise la compabilité à VB6 sous VB.NET, qui avait cette la fonction CALLBYNAME...
et il y a aussi les snippets : http://www.codyx.org/snippet_donner-valeur-dans-ensemble-meme-type-controle_528.aspx , qui certes ne sont tj pas VB.NET, mais j'en avais fait un sous VB.NET par compatibilité, mais pas retenu (probablement pour cette raison)... mais c'est possible...

Enfin, si tu trouve une source inspiration...

En réalité tu touches presque au but, et ton code final pourrait peut-être, être rajouté au snippet...

Je garde ton post sous le coude...

Amicalement,
Us.
Messages postés
723
Date d'inscription
dimanche 26 novembre 2006
Statut
Membre
Dernière intervention
23 janvier 2013
2
Salut,

Ok, je vais aller voir ça, je te tiens au courant

 
*** ebaudoux@club.fr ***
*** http://www.velersoftware.fr.nf/ ***
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
peut etre des elements de reponses dans le code suivant :

http://www.csharpfr.com/codes/METHODE-CLONAGE-DEEPCLONAGE_34850.aspx
Messages postés
723
Date d'inscription
dimanche 26 novembre 2006
Statut
Membre
Dernière intervention
23 janvier 2013
2
Salut,

Bon, depuis ma dernière réponse, et bien je n'ai pas avancé .
J'ai essayé plein de chose, basé souvent sur les liens que vous m'avez donné, mais rien de ce que j'ai fait ne fonctionne. Avez-vous d'autre chose pour m'aider?

 
*** ebaudoux@club.fr ***
*** http://www.velersoftware.fr.nf/ ***