Collection aus Klasse in einem DataGridView anzeigen und aktualisieren

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von bahnski.

    Collection aus Klasse in einem DataGridView anzeigen und aktualisieren

    Hallo,da ich noch nicht lange mit VB .net zu tun habe und ich wohl noch zu viel vba denke, komme ich mit meinem Problem nicht weiter!
    In meinem Beispiel habe ich eine Klasse Table und eine weitere Klasse mit dem Namen Field.
    Über die Klasse Table kann ich neue Felder dem Table hinzufügen. Diese werden dort in der Klasse Table in einer Collection gespeichert. Diese Collection übergebe ich als Datasource an das DataGridView.
    Wenn schon Felder angelegt sind, werden diese auch angezeigt! Füge ich später aber noch welche hinzu, oder ändere ich Werte, werden diese nicht angezeigt! Was muss ich machen, damit das aber funktioniert! Refresh und Update brachten keine Besserung!
    Starte ich mein Testprogramm und drücke auf die „Ändern“ Schaltfläche, so werden die Daten direkt geändert. Klicke ich aber zuerst auf das DataGridView, wird der Wert geändert, aber nicht angezeigt!
    Über jede Hilfe bin ich dankbar!
    Hier der Code und im Anhang mein Testprojekt!

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim objTable As New Table
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. With objTable
    5. .TableName = "Test"
    6. .TableDescription = "Testtabelle"
    7. .FieldAdd("Nachname", "Der Nachname, vor der Änderung")
    8. End With
    9. DataGridView1.DataSource = objTable.Fields
    10. End Sub
    11. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    12. Dim objField As New Table.Field
    13. With objField
    14. .FieldName = "Vorname"
    15. .FieldDescritpion = "Der Vorname"
    16. End With
    17. objTable.FieldAdd(objField)
    18. End Sub
    19. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    20. objTable.FieldChange("Nachname", "Der Nachname nach der Änderung!")
    21. End Sub
    22. End Class
    23. Public Class Table
    24. Public Property TableName As String
    25. Public Property TableDescription As String
    26. Public Property Fields As New Collection
    27. Public Sub FieldAdd(FieldName As String, Description As String)
    28. Dim objField As New Table.Field
    29. With objField
    30. .FieldName = FieldName
    31. .FieldDescritpion = Description
    32. End With
    33. Fields.Add(objField, objField.FieldName)
    34. End Sub
    35. Public Sub FieldAdd(Field As Table.Field)
    36. Fields.Add(Field, Field.FieldName)
    37. End Sub
    38. Public Function FieldGet(Fieldname As String) As Table.Field
    39. Return Fields(Fieldname)
    40. End Function
    41. Public Function FieldGet(Index As Integer) As Table.Field
    42. Return Fields(Index)
    43. End Function
    44. Public Sub FieldChange(Fieldname As String, Field As Table.Field)
    45. Dim objField As Table.Field = Fields.Item(Fieldname) = Field
    46. End Sub
    47. Public Sub FieldChange(Fieldname As String, Description As String)
    48. Dim objField As Table.Field = Fields.Item(Fieldname)
    49. objField.FieldDescritpion = Description
    50. End Sub
    51. Public Class Field
    52. Public Property FieldName As String
    53. Public Property FieldDescritpion As String
    54. End Class
    55. End Class​


    Die Form:

    VB.NET-Quellcode

    1. <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
    2. Partial Class Form1
    3. Inherits System.Windows.Forms.Form
    4. 'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen.
    5. <System.Diagnostics.DebuggerNonUserCode()> _
    6. Protected Overrides Sub Dispose(ByVal disposing As Boolean)
    7. Try
    8. If disposing AndAlso components IsNot Nothing Then
    9. components.Dispose()
    10. End If
    11. Finally
    12. MyBase.Dispose(disposing)
    13. End Try
    14. End Sub
    15. 'Wird vom Windows Form-Designer benötigt.
    16. Private components As System.ComponentModel.IContainer
    17. 'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich.
    18. 'Das Bearbeiten ist mit dem Windows Form-Designer möglich.
    19. 'Das Bearbeiten mit dem Code-Editor ist nicht möglich.
    20. <System.Diagnostics.DebuggerStepThrough()> _
    21. Private Sub InitializeComponent()
    22. Me.DataGridView1 = New System.Windows.Forms.DataGridView()
    23. Me.Button1 = New System.Windows.Forms.Button()
    24. Me.Button2 = New System.Windows.Forms.Button()
    25. CType(Me.DataGridView1, System.ComponentModel.ISupportInitialize).BeginInit()
    26. Me.SuspendLayout()
    27. '
    28. 'DataGridView1
    29. '
    30. Me.DataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize
    31. Me.DataGridView1.Location = New System.Drawing.Point(12, 12)
    32. Me.DataGridView1.Name = "DataGridView1"
    33. Me.DataGridView1.Size = New System.Drawing.Size(776, 150)
    34. Me.DataGridView1.TabIndex = 0
    35. '
    36. 'Button1
    37. '
    38. Me.Button1.Location = New System.Drawing.Point(12, 229)
    39. Me.Button1.Name = "Button1"
    40. Me.Button1.Size = New System.Drawing.Size(75, 23)
    41. Me.Button1.TabIndex = 1
    42. Me.Button1.Text = "Füge Wert hinzu"
    43. Me.Button1.UseVisualStyleBackColor = True
    44. '
    45. 'Button2
    46. '
    47. Me.Button2.Location = New System.Drawing.Point(106, 229)
    48. Me.Button2.Name = "Button2"
    49. Me.Button2.Size = New System.Drawing.Size(130, 23)
    50. Me.Button2.TabIndex = 2
    51. Me.Button2.Text = "Ändere Wert Index 1"
    52. Me.Button2.UseVisualStyleBackColor = True
    53. '
    54. 'Form1
    55. '
    56. Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
    57. Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
    58. Me.ClientSize = New System.Drawing.Size(800, 266)
    59. Me.Controls.Add(Me.Button2)
    60. Me.Controls.Add(Me.Button1)
    61. Me.Controls.Add(Me.DataGridView1)
    62. Me.Name = "Form1"
    63. Me.Text = "Form1"
    64. CType(Me.DataGridView1, System.ComponentModel.ISupportInitialize).EndInit()
    65. Me.ResumeLayout(False)
    66. End Sub
    67. Friend WithEvents DataGridView1 As DataGridView
    68. Friend WithEvents Button1 As Button
    69. Friend WithEvents Button2 As Button
    70. End Class
    Dateien
    • DatagridTest.zip

      (290,39 kB, 124 mal heruntergeladen, zuletzt: )
    Danke! Danke! Danke! Ist das schön einfach damit! Muss zwar viel Code umschreiben! Aber was soll es! Habe wieder was gelernt! Hier mein Testcode!

    VB.NET-Quellcode

    1. ​Imports System.ComponentModel
    2. Public Class Form1
    3. Dim objTable As New Table
    4. Dim objField As New Table.Field
    5. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    6. With objTable
    7. .TableName = "Test"
    8. .TableDescription = "Testtabelle"
    9. With objField
    10. .FieldName = "Nachname"
    11. .FieldDescritpion = "Der Nachname, vor der Änderung"
    12. End With
    13. .Fields.Add(objField)
    14. End With
    15. DataGridView1.DataSource = objTable.Fields
    16. End Sub
    17. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    18. Dim objField As New Table.Field
    19. With objField
    20. .FieldName = "Vorname"
    21. .FieldDescritpion = "Der Vorname"
    22. End With
    23. objTable.Fields.Add(objField)
    24. End Sub
    25. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    26. Dim objField As New Table.Field
    27. With objField
    28. .FieldName = "Nachname"
    29. .FieldDescritpion = "Der Nachname nach der Änderung!"
    30. End With
    31. objTable.Fields.Item(0) = objField
    32. End Sub
    33. End Class
    34. Public Class Table
    35. Public Property TableName As String
    36. Public Property TableDescription As String
    37. Public Property Fields As New BindingList(Of Table.Field)
    38. Public Class Field
    39. Public Property FieldName As String
    40. Public Property FieldDescritpion As String
    41. End Class
    42. End Class