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

VB.NET Discussion :

Aller chercher une propriété dans une DataSource [Débutant]


Sujet :

VB.NET

  1. #21
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    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

  2. #22
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 44
    Points : 27
    Points
    27
    Par défaut
    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.

  3. #23
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Citation Envoyé par chtinis Voir le message
    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

  4. #24
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 44
    Points : 27
    Points
    27
    Par défaut
    Sinon, ça fonctionne maintenant ton dgv ?
    Presque, quasiment, manque juste un petit truc... et c'est l'objet de ma question.
    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

  5. #25
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    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

  6. #26
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 44
    Points : 27
    Points
    27
    Par défaut
    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é...

  7. #27
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 44
    Points : 27
    Points
    27
    Par défaut
    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é.

    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)
    Et miracle, les sous-propriété s'affichent, on peut les modifier, l'objet dessous est modifié également.

    Il suffit de jouer dans les événements cellformating et cellvalidating (et un ptit coup dans cellvalidated aussi)

    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
    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
    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
    L'avantage c'est que le code est entièrement recopiable pour n'importe quelle DGW.
    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...

  8. #28
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    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

  9. #29
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 44
    Points : 27
    Points
    27
    Par défaut
    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...

  10. #30
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    pour ne citer qu'eux deux, ne vous vexer pas les autres ) à ce sujet ^^.
    Pas de problème
    À 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.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 10
    Dernier message: 01/12/2010, 08h26
  2. Eval d'une propriété d'une classe dans une classe
    Par bizet dans le forum ASP.NET
    Réponses: 4
    Dernier message: 28/10/2008, 09h43
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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