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 :

DataGridView databing objet enfant


Sujet :

VB.NET

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 319
    Points : 414
    Points
    414
    Par défaut DataGridView databing objet enfant
    Bonjour,

    Bon, le titre doit pas etre tres clair.

    En winform, j'ai un datagridview, appelé grdCertif, je veux le databinder avec une liste d'objets basé sur la classe BRProduitAttente

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Public Class BRProduitAttente
        Public Property Id as int
        Public Property NoBr As String
        Public Overridable Property Fourn As Fournisseur
    ...
    End Class
     
    Public Class Fournisseur
        Public Property Id as Int
        Public Property Nom as string
    ...
    End Class
    J'ai défini les colonnes du datagridview via l'interface, ca ca fonctionne nickel.
    Mon binding fonctionne pour les proprietés de la classe BRProduitAttente.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public sub LoadGrid()
            Dim BRProduitAttentes As List(Of BRProduitAttente)
    ....
            BRProduitAttentes = (From bra In contextEF.BRProduitAttente
                                 Where
                                    bra.BonReceptionAttente.DateSupp Is Nothing And
                                    bra.BonReceptionAttente.DateCrea >= DateSearch
                                 Select bra).ToList() 'Requete allégée pour la forme
            grdCertif.DataSource = BRProduitAttentes
            grdCertif.Columns(0).DataPropertyName = "NoBr"
            grdCertif.Columns(2).DataPropertyName = "Fournisseur.Nom"
    ...
    Mais je n'arrive pas a binder sur le champs Fournisseur.Nom
    La colonne reste vide.

    Si vous avez une idée je suis preneur.

    Question bonus :

    Est il possible de faire une concatenation dans un DataPropertyName ?

    Par exemple, avec des champs au pif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    grdCertif.Columns(4).DataPropertyName = "Id" + " " + "NoBr"
    Merci d'avoir pris le temps de me lire.

    Et si vous avez besoin d'infos supplementaires, n'hesitez pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'TODO : trouver une signature mieux que celle la

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    Les "nested properties" ou proprietes imbriquées via des sous objets tel que ta prop CLR Fourn (du type Class Fournisseur) ne sont pas traitées par le Databinding des Winforms...

    il faut y pallier par des expédients de ton propre code
    Option 1:
    En "wrappant" les prop <un à une> dans ton class BRProduitAttente à la manu !!!
    exemple code :

    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
    28
    29
    30
    31
    32
    33
     
     
    Public Class Fournisseur
        Public Property Id As Integer
        Public Property Nom As String
    End Class
     
     
    Public Class BRProduitAttente
        Public Property Id As Integer
        Public Property NoBr As String
        Public Property FId As Integer
            Get
                Return Fourn.Id
            End Get
            Set(value As Integer)
                Fourn.Id = value
            End Set
        End Property
        Public Property Fnom As String
            Get
                Return Fourn.Nom
            End Get
            Set(value As String)
                Fourn.Nom = value
            End Set
        End Property
     
        Public Property Fourn As Fournisseur
        Public Sub New()
            Fourn = New Fournisseur
        End Sub
    End Class
    Option 2:

    que je trouve plus élégante est ,tout en conservant intacts tes 2 class est d'utiliser un "Partial Class" (toujours disponible pour tous nos class "Custom" y compris ton c]ass BRProduitAttente ) dans un fichier à part...
    code .vb du class "Partial" (fichier PartialBRProduitAttente.vb
    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
     
     
    Partial Public Class BRProduitAttente
     
        Public Property FournId As Integer
            Get
                Return Me.Fourn.Id
            End Get
            Set(value As Integer)
                Me.Fourn.Id = value
            End Set
        End Property
        Public Property FournNom As String
            Get
                Return Me.Fourn.Nom
            End Get
            Set(value As String)
                Me.Fourn.Nom = value
            End Set
        End Property
    End Class
    après le code de ton Winform s'en trouve allégé ...
    code exemple :
    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
    28
    29
    30
     
     
    Public Class Form1
        Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
            LoadGrid()
        End Sub
        Public Sub LoadGrid()
            Dim BRProduitAttentes As List(Of BRProduitAttente)
            BRProduitAttentes = GetProduits()
            grdCertif.DataSource = BRProduitAttentes
            ' on cache le fourbi fournisseur
            grdCertif.Columns(2).Visible = False
        End Sub
     
     
        Private Function GetProduits() As List(Of BRProduitAttente)
            Dim l As New List(Of BRProduitAttente)
            For i As Integer = 1 To 10
                Dim prod As New BRProduitAttente() With {
                    .Id = i * 100,
                    .NoBr = "prod" + i.ToString(),
                    .Fourn = New Fournisseur() With {
                        .Id = i,
                        .Nom = "alibaba"}}
                l.Add(prod)
            Next
     
            Return l
        End Function
    End Class
    bon code...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 319
    Points : 414
    Points
    414
    Par défaut
    Bonjour,

    Merci pour la solution.

    Je vais tester tout ça.

    Et si tout est bon, bah je clôture le sujet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'TODO : trouver une signature mieux que celle la

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 03/12/2008, 16h49
  2. Propagation des droits aux objets enfants
    Par rabddoul dans le forum C#
    Réponses: 2
    Dernier message: 28/10/2008, 13h05
  3. Réponses: 8
    Dernier message: 12/07/2008, 12h29
  4. Réponses: 3
    Dernier message: 15/12/2006, 18h52
  5. Afficher Objet enfants d'un tabpage
    Par dederfred dans le forum Delphi
    Réponses: 4
    Dernier message: 27/10/2006, 04h39

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