cs_veler
Messages postés723Date d'inscriptiondimanche 26 novembre 2006StatutMembreDernière intervention23 janvier 2013
-
27 févr. 2009 à 18:30
cs_veler
Messages postés723Date d'inscriptiondimanche 26 novembre 2006StatutMembreDernière intervention23 janvier 2013
-
13 mars 2009 à 08:53
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) ???
cs_veler
Messages postés723Date d'inscriptiondimanche 26 novembre 2006StatutMembreDernière intervention23 janvier 20133 27 févr. 2009 à 21:10
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
cs_veler
Messages postés723Date d'inscriptiondimanche 26 novembre 2006StatutMembreDernière intervention23 janvier 20133 13 mars 2009 à 08:53
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?