Announcement

Collapse
No announcement yet.

Datenbindung an DataGridView

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Datenbindung an DataGridView

    Hallo Forum,

    Ich habe eine Klasse implementiert die von BindingList(of T) abgeleitet ist.

    Konkret:
    Code:
    Public Class clsArticleCollection
        Inherits BindingList(Of clsArticle)
    End Class
    Diese binde ich jetzt an eine BindingSource welche ich an mein DataGridView anhänge.

    Konkret:
    Code:
    private ArticleBindingSource As New BindingSource()
    private myArticleCollection As New clsArticleCollection()
    ArticleBindingSource.DataSource = myArticleCollection
    So weit so gut. Jetzt nur noch die DataGridView initialisieren
    Code:
    private ArticleDataGridView As New DataGridView()
    
    Me.ArticleDataGridView.SuspendLayout()
    
    Me.ArticleDataGridView.AutoGenerateColumns = False
    'Hier wird jetzt die vorher erstellte ArticleBindingSource an das DataGridView
    'gehängt welches dieses mit den Daten aus der Collection füllt
    Me.ArticleDataGridView.DataSource = Me.ArticleBindingSource
    
    Dim colCode As New DataGridViewTextBoxColumn
    colCode.Name = "Code"
    colCode.DataPropertyName = "Code"       --> Code = Eigenschaft von clsArticle
    colCode.HeaderText = "Artikelnummer"
    colCode.ReadOnly = True
    Me.ArticleDataGridView.Columns.Add(colCode)
    
    Dim colDescription As New DataGridViewTextBoxColumn
    colDescription.Name = "Description"     --> Description = Eigenschaft von clsArticle
    colDescription.DataPropertyName = "Description"
    colDescription.HeaderText = "Artikelbeschreibung"
    colDescription.ReadOnly = True
    Me.ArticleDataGridView.Columns.Add(colDescription)
    
    Problem Spalte -> Erklärung folgt unten
    Dim colPrices As New DataGridViewComboBoxColumn
    colPrices.Name = "Prices"
    colPrices.HeaderText = "Preise"
    colPrices.DataSource = ???
    colPrices.DataPropertyName = ???
    Me.ArticleDataGridView.Columns.Add(colPrices)
    
    'Aufbau der GridView ist beendet.
    Me.ArticleDataGridView.ResumeLayout()
    So jetzt habe ich ein DataGridView mit 3 Spalten.
    1. Spalte = DataGridViewTextBoxColumn -> Auf Eigenschaft von clsArticle gebunden
    2. Spalte = DataGridViewTextBoxColumn -> Auf Eigenschaft von clsArticle gebunden
    3. Spalte = DataGridViewComboBoxColumn

    Spalte 1 und Spalte 2 werden jetzt mit Daten aus meiner ArticleBindingSource gefüllt.

    Mein Problem ist es jetzt die 3. Spalte zu füllen, da die Daten mit denen diese (ComboBox) gefüllt werden soll aus einer Eigenschaft (PriceCollection) von clsArticle kommen welche mir auch eine BindingList(of T) zurück gibt.

    Konkret:
    Code:
    Public Class clsArticle
    
        Protected sCode As String
        Protected sDescription As String
        Protected myPriceCollection As clsPriceCollection
    
        Public Overridable Property Code() As String
            Get
                Return Me.sCode
            End Get
            Set(ByVal value As String)
                Me.sCode = value
            End Set
        End Property
    
        Public Overridable Property Description() As String
            Get
                Return Me.sDescription
            End Get
            Set(ByVal value As String)
                Me.sDescription = value
            End Set
        End Property
    
        
        Diese Eigenschaft enthält die Daten für die ComboBox Spalte
        Protected Overridable Property PriceCollection As clsPriceCollection
            Get
                Return Me.myPriceCollection
            End Get
            Set(ByVal value As clsArticlePriceCollection)
                Me.myPriceCollection = value
            End Set
        End Property
    
    End Class
    
    Public Class clsPriceCollection
        Inherits BindingList(Of clsPrice)
    
    End Class
    
    Public Class clsPrice
    
        Protected dPrice As Double
        Protected sComment As String
    
        Public Overridable Property Price() As Double
            Get
                Return Me.dPrice
            End Get
            Set(ByVal value As Double)
                Me.dPrice = value
            End Set
        End Property
    
        Public Overridable Property Comment() As String
            Get
                Return Me.sComment
            End Get
            Set(ByVal value As String)
                Me.sComment = value
            End Set
        End Property
    
    End Class
    Kann mir einer einen Tipp geben, wie ich die ComboBox jetzt über meine BindingSource gefüllt bekomme.

    Ich hoffe ich habe mich Verständlich ausgedrückt.

  • #2
    Hallo,

    ganz kann ich nicht antworten, weil ich mit C# arbeite und bisher nur DataTable (nicht BindingList of T) verwendet habe. Grundsätzlich musst Du bei der DataGridViewComboBoxColumn so vorgehen:

    DataPropertyName ist die Eigenschaft der BindingSource, die die Daten für diese Spalte liefert.

    DataSource oder Items liefert die Elemente für die Auswahl.

    DisplayMember und ValueMember beziehen sich auf Eigenschaften der Auswahlliste.

    Die Werte aus ValueMember der Auswahlliste und DataPropertyName der Hauptliste entsprechen einander (bei DataTables wäre das ein ForeignKey/DataRelation).

    Ich hoffe, diese Hinweise genügen. Jürgen

    Comment


    • #3
      Hallo Jürgen,

      Danke für die schnelle Antwort, leider bringt das mich nicht weiter.

      Mein Problem liegt vielmehr daran, dass ich es nicht hinbekomme die DataSource Eigenschaft der DataGridViewComboBoxColumn auf die Eigenschaft PriceCollection der ArticleBindingSource von meiner Collection (clsArticleCollection) anzuhängen.

      z.B.:
      Code:
      ArticleDataGridView.DataSource = ArticleBindingSource
      
      Dim colCode As New DataGridViewTextBoxColumn
      colCode.Name = "Code"
      colCode.DataPropertyName = "Code"       --> kein Problem
      colCode.HeaderText = "Artikelnummer"
      colCode.ReadOnly = True
      Me.ArticleDataGridView.Columns.Add(colCode)
      
      Dim colPrices As New DataGridViewComboBoxColumn
      colPrices.Name = "Prices"
      colPrices.HeaderText = "Preise"
      colPrices.DataPropertyName = "PriceCollection"
      colPrices.DataSource = "PriceCollection"    --> läst er nicht zu : Laufzeit Fehler --> Das komplexe DataBinding akzeptiert als Datenquelle entweder IList oder IListSource.
      colPrices.DisplayMember = "Price"  --> Price = Eigenschaft von clsPrice
      colPrices.ValueMember = "Price"     --> Price = Eigenschaft von clsPrice
      Me.ArticleDataGridView.Columns.Add(colPrices)

      Comment


      • #4
        Hallo,

        colPrices.DataSource = "PriceCollection" --> läst er nicht zu : Laufzeit Fehler --> Das komplexe DataBinding akzeptiert als Datenquelle entweder IList oder IListSource.
        colPrices.DisplayMember = "Price" --> Price = Eigenschaft von clsPrice
        colPrices.ValueMember = "Price" --> Price = Eigenschaft von clsPrice
        wenn zwischen DisplayMember und ValueMember kein Unterschied ist - wozu die ComboBox?

        Frage: der Sinn der ComboBox ist doch, dass du Preisgruppen oder so etwas in der Art in einer DataTable oder in einer Liste vordefiniert hast, um dann darauf zuzugreifen?

        ValueMember: ID des Preises
        DisplayMember: Wert der Preises (z.B.: 300,-)

        Gruß
        Christian

        Comment


        • #5
          Hallo Christian,

          wenn zwischen DisplayMember und ValueMember kein Unterschied ist - wozu die ComboBox?
          Die ComboBox wird benutzt um die Preise (es können mehrere pro Artikel sein) für den Artikel darzustellen.

          Wenn der Artikel mit dem ausgewählten Preis der Rechnung hinzugefügt wird ist die ID des Preises nicht mehr relevant. Mich interessiert nur der Preis.

          Also ist es egal ob ich:
          Code:
          colPrices.ValueMember = "Price" --> Price = Eigenschaft von clsPrice
          oder so:
          Code:
          colPrices.ValueMember = "PriceId" --> PriceId = Eigenschaft von clsPrice
          Es macht ja keinen Sinn auf der Rechnung eine Referenz auf den Preis zu speichern, denn wenn dieser geändert würde dann wäre meine Rechnung wenn ich sie nach einer Preisänderung des Artikels aufrufen würde ja falsch. Oder wie wird das normalerweise geregelt?


          Frage: der Sinn der ComboBox ist doch, dass du Preisgruppen oder so etwas in der Art in einer DataTable oder in einer Liste vordefiniert hast, um dann darauf zuzugreifen?
          Ja die Benutzer können die Preise selbst Verwalten. D.h. sie können bei einem Artikel mehrere Preise angeben. Also jeder Artikel kann mehrere verschiedene Preise haben. Diese werden dann in der Datenbank abgelegt.
          Beim Anzeigen des Artikel-Dialoges sollen dann die Artikel mit ihren Preisen (Mehrere Preise also --> ComboBox) in einem DataGridView angezeigt werden

          Comment


          • #6
            Hallo,

            Mehrere Preise also --> ComboBox

            ComboBox --> DisplayMember und ValueMember!

            ValueMember: muss eindeutig sein! (zum Beispiel ID-Werte einer Datenbanktabelle)
            DisplayMember: Klartext (zum Beispiel: Produktpreis)

            Oder wie wird das normalerweise geregelt?
            Diese Frage lässt sich mit "Datenbank-Design" beantworten!

            Vor dem Schreiben von Code steht eben die Auseinandersetzung mit dem "Wie" des Ablegens von Daten.

            Gruß
            Christian

            Comment


            • #7
              Hallo ihr zwei,

              habe mein Problem gelöst indem ich eine weitere BindingSource erstellt habe.

              Konkret:
              Code:
              Private PriceBindingSource As New BindingSource()
              PriceBindingSource.DataSource = ArticleBindingSource
              PriceBindingSource.DataMember = PriceCollection
              So diese weitere BindingSource kann ich jetzt an meine DataGridViewComboboxColumn hängen

              Konkret:
              Code:
              Dim colPrices As New DataGridViewComboBoxColumn
              colPrices.Name = "Prices"
              colPrices.HeaderText = "Preis"
              colPrices.DataSource = Me.PriceBindingSource
              colPrices.DisplayMember = "Price"
              colPrices.ValueMember = "PriceId"
              Me.dgvArticles.Columns.Add(colPrices)
              Trotzdem vielen Dank für eure Bemühungen.

              Shöne Grüße & frohes Schaffen,
              Jeff

              Comment

              Working...
              X