Il te faut quelque chose qui te permette d'identifier ton objet de manière unique. Comme l'id dans mon exemple. Il te permettra, toujours comme dans mon exemple, de récupérer l'objet correspondant et d'y affecter la nouvelle valeur.
Il te faut quelque chose qui te permette d'identifier ton objet de manière unique. Comme l'id dans mon exemple. Il te permettra, toujours comme dans mon exemple, de récupérer l'objet correspondant et d'y affecter la nouvelle valeur.
Kropernic
Mmmmm, je découvre encore un nouveau truc. Encore pas mal de lecture cet aprem...
Juste pour ma culture, et parce que ca me servira sans doute par la suite, si j'ai un objet obj, et 2 string "prop1" et "prop2", comment aller chercher un pointeur suur obj.prop1.prop2?
Ca me permettrait de passer les propriétés facilement en argument de certaines fonctions.
Et encore merci pour l'aide apportée.
Euh... Si j'ai bien compris la question, tu ne peux pas. Tu peux obj.prop1 et obj.prop2 mais pas obj.prop1.prop2... A moins que prop1 soit du même type que obj ^^. Mais de toute façon, même si c'est valide en théorie, je n'ai jamais vu de cas pratique qui nécessite ce genre de construction.
Sinon, ça fonctionne maintenant ton dgv ?
Kropernic
Presque, quasiment, manque juste un petit truc... et c'est l'objet de ma question.Sinon, ça fonctionne maintenant ton dgv ?
En fait je me suis mal exprimé, j'ai un objet obj, qui a (entre autres) une propriété prop1 qui a elle même (entre autres) une propriété prop2, et c'est cette propriété à laquelle je dois accéder.
Si je ne devais pas le mettre dans une fonction, j'écrirais simplement obj.prop1.prop2=value, mais je dois construire la fonction, donc il me faut pointer sur cette propriété à partir des argument (obj, "prop1.prop2",value)
J'y arrive avec une propriété simple par la fonction
obj.GetType.GetProperty("prop1").SetValue(obj, value)
mais obj.GetType.GetProperty("prop1.prop2").SetValue(obj, value) ne passe pas, c'est rageant
Cela doit être faisable en utilisant la réflection je pense. Mais cela dépasse mes compétences. C'est un truc que je n'ai jamais utilisé.
Je te suggère de créer une autre discussion pour poser cette question précise. Tu auras des réponses
Kropernic
C'est fait:
http://www.developpez.net/forums/d15...ine-caractere/
J'espère avoir une réponse rapide, et en effet, je suis quasi sur que la bonne piste est la réflection.
Là je travaille sur getmember(), mais çan'a pas l'air super.
Ce qui me pose souci c'est getvalue(), qui me renvoie la valeur d'une propriété, alors que je voudrais un pointeur sur cette propriété...
Victoire
appeler une propriété par son nom... callbyname.
On a donc maintenant un DGW dont on peut définir les datamember sur des propriété enfant comment on le ferait dans un databing, datamember "prop1.sousprop1,...etc" de manière quasi illimité.
Et miracle, les sous-propriété s'affichent, on peut les modifier, l'objet dessous est modifié également.
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 dim ma_bindingliste as new bindinglist(of objet) Dim dgw As New DataGridView dgw.DataSource = ma_binding_liste Dim col0, col1, col2, col3 As New DataGridViewColumn col0.DataPropertyName = "prop1" col1.datapropertyname = "prop2" col2.DataPropertyName = "prop3.sous_prop1" col3.DataPropertyName = "prop3.sous_prop2" dgw.Columns.Add(col0) dgw.Columns.Add(col1) dgw.Columns.Add(col2) dgw.Columns.Add(col3)
Il suffit de jouer dans les événements cellformating et cellvalidating (et un ptit coup dans cellvalidated aussi)
Et les fonctions appelées:
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 Sub DGW_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DGW.CellFormatting If DGW.Columns(e.ColumnIndex).DataPropertyName.Contains(".") Then If Not IsNothing(DGW.Rows(e.RowIndex).DataBoundItem) Then e.Value = EvaluateValue(DGW.Rows(e.RowIndex).DataBoundItem, DGW.Columns(e.ColumnIndex).DataPropertyName, e.RowIndex) End If End If End Sub Private Sub DGW_CellValidated(sender As Object, e As DataGridViewCellEventArgs) Handles DGW.CellValidated DGW.Refresh() End Sub Private Sub DGW_CellValidating(sender As Object, e As DataGridViewCellValidatingEventArgs) Handles DGW.CellValidating If DGW.Columns(e.ColumnIndex).DataPropertyName.Contains(".") Then If Not IsNothing(DGW.Rows(e.RowIndex).DataBoundItem) Then setproperty(DGW.Rows(e.RowIndex).DataBoundItem, DGW.Columns(e.ColumnIndex).DataPropertyName, e.FormattedValue.ToString) End If End If End Sub
L'avantage c'est que le code est entièrement recopiable pour n'importe quelle DGW.
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
21
22
23
24
25
26
27 Public Sub setproperty(ByRef obj As Object, path As String, value As Object) Dim liste_prop() As String = path.Split(".") Dim last_prop As New Object Try For i = 0 To liste_prop.Count - 2 last_prop = CallByName(obj, liste_prop(i), CallType.Get) Next i CallByName(last_prop, liste_prop(UBound(liste_prop)), CallType.Set, value) Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub Public Function EvaluateValue(obj As Object, expression As String, index As Object) As Object Dim liste_propriete() As String = expression.Split(".") For i = 0 To liste_propriete.Count - 1 Dim propriete = obj.GetType.GetProperty(liste_propriete(i)) If liste_propriete(i) = "Item" Then obj = propriete.GetValue(obj, {index}) Else : obj = propriete.GetValue(obj) End If Next Return obj End Function
Par contre, je n'ai pas vraiment pris le temps de le protéger...et je n'ai aussi aucune idée des ressources demandées...
J'ai envie de dire que si ça fonctionne, c'est le principal
Par contre, je serais quand même curieux d'avoir l'avis d'un pol63 ou d'un tomlev (pour ne citer qu'eux deux, ne vous vexer pas les autres ) à ce sujet ^^.
Kropernic
Ce serait en effet bien de savoir si cette solution est pérenne, sachant toute la partie cellformatting est tirée d'une réponse du datagridview manager chez MS.
Je pensais que c'était la fin de mes ennuis, mais visiblement je vais avoir le même souci sur le chart associé, puisque databindXY n'accepte pas non plus les sous-propriétés
Il faudrait que j'arrive à avoir accès aux valeurs dans une colonne ca m'éviterait d'avoir à refaire le travail...
À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.
Ô Saint Excel, Grand Dieu de l'Inutile.
Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager