Datagridview Datasource BindingList Selecbox

  • VB.NET
  • .NET 4.5

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

    Datagridview Datasource BindingList Selecbox

    Hallo,
    ich habe einem DataGridView als Datasource eine BindingList zugewiesen. So weit so schön. Die Daten werden angezeigt. auch kann ich neue hinzufügen, ändern oder löschen. Was ich aber versuchen möchte ist, das wenn ich ein Wert bearbeite ich eine Auswahl Möglichkeit (Selectbox) einer anderen Bindinglist bekomme. Als Beispiel habe ich ein kleines Testprojekt erstellt.
    Nehmen wir an ich definiere eine Form und möchte dieser Form eine existierende Tabelle hinzufügen. Beides liegt als BindingList vor. Wie mach ich das! Ich habe versuche dieses Problem schon seit einer Woche zu lösen, finde aber keine Lösung.
    Für jede Anregung und Hilfestellung bin ich dankbar!
    Gruß
    Christian


    Wie in dem Bild zu sehen, möchte ich die Spalte SourceTableName eine Auswahlmöglichkeit des Wertes TableName aus meine Object objProject.Tables haben. Wenn es geht auch noch sortiert!
    Der Code meiner Testform. Diese beinhaltet nur das DataGridView

    VB.NET-Quellcode

    1. ​Public Class Form1
    2. Dim objProject As New Project
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Dim objTable As New Project.Table
    5. Dim objForm As New Project.Form
    6. With objProject
    7. .ProjectName = "Testprojekt"
    8. .PorjectDescription = "Das ist ein Testproject zum testen eines Datagridviews"
    9. 'Erstelle 2 Tabellen zum testen
    10. objTable = New Project.Table
    11. objTable.Tablename = "Tabelle 1"
    12. objTable.TableDescription = "Beschreibung Tabelle 1"
    13. .Tables.Add(objTable)
    14. objTable = New Project.Table
    15. objTable.Tablename = "Tabelle 2"
    16. objTable.TableDescription = "Beschreibung Tabelle 2"
    17. .Tables.Add(objTable)
    18. 'Erstelle 2 Forms zum testen
    19. objForm = New Project.Form
    20. objForm.FormName = "Testform 1"
    21. objForm.SourceTableName = "Tabelle 1"
    22. .Forms.Add(objForm)
    23. objForm = New Project.Form
    24. objForm.FormName = "Testform 2"
    25. objForm.SourceTableName = "Tabelle 2"
    26. .Forms.Add(objForm)
    27. End With
    28. DataGridView1.DataSource = objProject.Forms
    29. End Sub
    30. End Class


    Und hier die Klasse(n)

    VB.NET-Quellcode

    1. ​Imports System
    2. Imports System.ComponentModel
    3. Public Class Project
    4. Public Property ProjectName As String
    5. Public Property PorjectDescription As String
    6. Public Property Tables As New BindingList(Of Project.Table)
    7. Public Property Forms As New BindingList(Of Project.Form)
    8. Public Class Table
    9. Public Property Tablename As String
    10. Public Property TableDescription As String
    11. Public Property Fields As New BindingList(Of Project.Table.Field)
    12. Public Class Field
    13. Public Property FieldName As String
    14. End Class
    15. End Class
    16. Public Class Form
    17. Public Property FormName As String
    18. Public Property FormDescription As String
    19. Public Property SourceTableName As String
    20. End Class
    21. End Class
    Eine Möglichkeit wäre z.B. die Ergänzung einer ComboBox-DGV-Spalte. Damit arbeitet man normalerweise, wenn man mit nem tDS seine Daten verwaltet und in einer Tabelle auf die Werte einer anderen Tabelle zugreifen will.
    Schreib mal späßleshalber nach Zeile#33:

    VB.NET-Quellcode

    1. Dim DGVCBC As New DataGridViewComboBoxColumn
    2. DGVCBC.AutoComplete = True
    3. DGVCBC.DataSource = objProject.Forms
    4. DGVCBC.DisplayMember = "SourceTableName"
    5. DataGridView1.Columns.Add(DGVCBC)
    Vielleicht reicht Dir das schon. Ist aber auch ausbaufähig.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Daran habe ich auch schon gedacht! Aber wie bekomme ich den ausgewählten Wert in mein Objekt gespeichert?

    Die abgewandelte Form:

    VB.NET-Quellcode

    1. ​Public Class Form1
    2. Dim objProject As New Project
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Dim objTable As New Project.Table
    5. Dim objForm As New Project.Form
    6. With objProject
    7. .ProjectName = "Testprojekt"
    8. .PorjectDescription = "Das ist ein Testproject zum testen eines Datagridviews"
    9. 'Erstelle 2 Tabellen zum testen
    10. objTable = New Project.Table
    11. objTable.Tablename = "Tabelle 1"
    12. objTable.TableDescription = "Beschreibung Tabelle 1"
    13. .Tables.Add(objTable)
    14. objTable = New Project.Table
    15. objTable.Tablename = "Tabelle 2"
    16. objTable.TableDescription = "Beschreibung Tabelle 2"
    17. .Tables.Add(objTable)
    18. 'Erstelle 2 Forms zum testen
    19. objForm = New Project.Form
    20. objForm.FormName = "Testform 1"
    21. objForm.SourceTableName = "Tabelle 1"
    22. .Forms.Add(objForm)
    23. objForm = New Project.Form
    24. objForm.FormName = "Testform 2"
    25. objForm.SourceTableName = "Tabelle 2"
    26. .Forms.Add(objForm)
    27. End With
    28. DataGridView1.DataSource = objProject.Forms
    29. Dim DGVCBC As New DataGridViewComboBoxColumn
    30. DGVCBC.AutoComplete = True
    31. DGVCBC.DataSource = objProject.Forms
    32. DGVCBC.DisplayMember = "SourceTableName"
    33. DGVCBC.HeaderText = "SourceTableName"
    34. DataGridView1.Columns.Add(DGVCBC)
    35. End Sub
    36. End Class
    Eigentlich sollte das Ganze so funktionieren, dass man den Projektdatenquellen Deine Projektklasse hinzufügt, dann bekommt man über passend (automatisch) erstellte BindingSources guten Zugriff auf alles. Aber so richtig bekomm ich's momentan nicht hin.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Tja, das kommt davon, wenn man die ganze Zeit mit komfortablen tDS-Konstruktionen arbeitet. Umdenken fällt mir da etwas schwer :S

    Ich hab es für den Moment:
    Zieh Dir eine leere BindingSource (BS1) auf Dein Formular, dann geh in den Eigenschaften auf DataSource klicken, |Projektdatenquelle hinzufügen...|

    Dann [Objekt] -> über den TreeView Deine Projektklasse auswählen

    Dann ziehst Du Dir ein DGV auf Dein Form, SmartTag anklicken, |Datenquelle auswählen:| -> BS1 -> Forms

    SmartTag -> |Spalten bearbeiten...| die Spalte "SourceTableName" auswählen -> ColumnType auf DataGridViewComboBoxColumn ändern

    bei DataSource: neue Projektdatenquelle -> Objekt -> bei Deiner Klasse: [x] Tables, ValueMember und DisplayMember: Tablename

    Nun hast Du also 3 BindingSources:
    BS1, welche an kein CE gebunden ist, aber mit der Projektklasse "verbunden" ist.
    Die FormsBindingSource, welche über die BS1 gekoppelt ist und im 1. DGV die Forms (für das gewählte Projekt (BS1.Current)) anzeigt.
    Die TableBindingSource, die an die Tables der Projektklasse gebunden ist, aber alle möglichen Tables anzeigt, da sie nicht an die BS1 gekoppelt ist und somit nicht mit BS1.Current verknüpft ist.
    Nun noch die Datenbefüllung, sonst siehst Du gar nix.
    Nachdem Du im Code objProject mit Daten befüllt hast, noch schreiben:

    VB.NET-Quellcode

    1. BindingSource1.Add(objProject) 'Macht klar, dass BS1 eine Project-Instanz kennt, nämlich objProject
    2. TableBindingSource.DataSource = objProject.Tables 'TableBindingSource kennt nun alle Tabellen aus objProject - auch wenn sich BS1.Current mal ändern sollte!


    Das war's.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    bahnski schrieb:

    ich habe einem DataGridView als Datasource eine BindingList zugewiesen. So weit so schön. Die Daten werden angezeigt. auch kann ich neue hinzufügen, ändern oder löschen. Was ich aber versuchen möchte ist, das wenn ich ein Wert bearbeite ich eine Auswahl Möglichkeit (Selectbox) einer anderen Bindinglist bekomme...

    Wies aussieht wachsen deine Anforderungen.
    Da täte ich jetzt schon empfehlen, auf typisiertes Dataset umzusteigen. Bindinglist als DataSource ist ziemlich beschränkt in ihren Fähigkeiten.
    Was du bisher anforderst geeht zwar noch, aber wenn du sortieren willst oder abspeichern oder filtern, oder... dann wirste iwann doch umsteigen (oder grotesken Programmieraufwand treiben) müssen. Und alles nochmal neu lernen.
    Also sehr empfehle ich, es gründlich zu lernen, von Anfang an - gugge codeproject.com/Articles/10309…l-Datamodel-for-Beginners
    und die beiden Folge-Artikel.
    Für einen SchnellSchnell-Einblick, was alles möglich ist, gugge vier Views-Videos