Darstellung von Daten mit Checkboxen

  • VB.NET
  • .NET (FX) 4.0

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

    Darstellung von Daten mit Checkboxen

    Ich könnte mich so ärgern, VB bringt mich manchmal zur Verzweiflung (bin darin noch Anfänger).

    Folgende Problemstellung:
    Ich mache eine WinForms-Anwendung, die Daten aus einer SQLite Datenbank auslesen soll. Darin ist unter anderem eine Tabelle, die die Werte ID und Name enthält. Jetzt will ich die Spalte Name ausgeben zusammen mit einer Checkbox, man soll also nachher die Items aus der Datenbank ankreuzen können und die IDs der angekreuzten Elemente sollen für andere Funktionen weitergegeben werden. Das Einlesen der Tabellen aus SQLite in eine Datatable funktioniert einwandfrei, die Darstellung kriege ich auch hin.

    Habe also erst einmal die Checkedlistbox genommen und es funktioniert auch einwandfrei, allerdings kann die CheckedListBox keine automatischen Zeilenumbrüche, sodass man bei einer fixen Breite entweder einen horizontalen Scrollbalken hat oder der Text abgeschnitten wird.

    Jetzt habe ich DataGridView genommen und der Text wird korrekt umgebrochen, allerdings weiß ich nicht, wie die Daten richtig binde (also nur die Ausgabe der Spalten funktioniert zwar, aber statt der IDs sollen da Checkboxen sein, die die IDs als "Name" haben).

    Nur mal für den Anfänger, der eigentlich nur Webanwendungen macht:
    Dort kann jedes Formelement ja eine ID, eine Klasse, einen Namen und einen Wert haben.

    Wie mache ich das hier?

    Also was ich möchte:

    1) ein DatagridView mit zwei Spalten, eine mit Text, eine mit Checkbox. Die Checkbox kann den Wert (z.B. in PHP wäre das die Option value) True oder False haben und der Name der Checkbox soll die ID aus der Datenbank sein (oder bessergesagt zusammengesetzt: ckbox[ID]). Der Name daneben entsprechend der Name, der zur ID gehört. Ich bekomme es schon hin, eine DataGridViewCheckBoxColumn usw. einzufügen, aber die ist ja nicht mit den IDs der Datenbank verknüpft.

    2) Ich möchte die Checkboxen anhand der IDs aus der Datenbank ansprechen können und nicht anhand ihrer Reihe in der Datatable. Zum Beispiel, um die Checkbox zu switchen, wenn jemand auf den Namen daneben klickt und für einen Button "alles auswählen / abwählen".

    Ist das möglich? Und wenn ja, wie genau?

    Ich habe mich jetzt wirklich stundenlang durch sämtliche Foren gelesen, aber ich steh völlig auf dem Schlauch. Vielleicht gehe ich auch falsch heran.

    Bei den CheckedListBoxes habe ich das so gelöst mit dem Index:

    Quellcode

    1. Public Class MyListBoxItem
    2. Private _name As String
    3. Private _index As String
    4. Public Property Name As String
    5. Get
    6. Return _name
    7. End Get
    8. Set(ByVal value As String)
    9. _name = value
    10. End Set
    11. End Property
    12. Public Property Index As String
    13. Get
    14. Return _index
    15. End Get
    16. Set(ByVal value As String)
    17. _index = value
    18. End Set
    19. End Property
    20. Public Overrides Function ToString() As String
    21. Return Name
    22. End Function
    23. End Class
    24. Using connection As New SQLiteConnection
    25. connection.ConnectionString = "Data Source=" + Modul_Global.database
    26. connection.Open()
    27. Using elsetable = New DataTable()
    28. elsetable.TableName = "else"
    29. Using adapter = New SQLiteDataAdapter("SELECT analysen.ID AS ID, analysen.Name AS Name FROM analysen INNER JOIN zuweisung_betriebe_analysen ON analysen.ID = zuweisung_betriebe_analysen.ID_Analyse INNER JOIN betriebe ON betriebe.ID = zuweisung_betriebe_analysen.ID_Betrieb WHERE analysen.Kategorie = 4 AND betriebe.Betrieb = '" + Modul_Global.firma + "' ORDER BY analysen.Name ASC", connection)
    30. adapter.Fill(elsetable)
    31. lb_else.Items.Clear()
    32. Dim i As Integer
    33. For i = 0 To (elsetable.Rows.Count - 1)
    34. Me.lb_else.Items.Add(New MyListBoxItem() With {.Name = elsetable.Rows(i)("Name"), .Index = elsetable.Rows(i)("ID")}, False)
    35. Next
    36. End Using
    37. End Using
    38. End Using


    Das kam mir aber irgendwie "falsch" vor (obwohl es funktionierte) :D
    Im Datagridview werden Datensätze angezeigt. Haben die Datensätze eine Boolean-Spalte, so zeigt das Grid diese Spalte als CheckboxDataGridViewColumn an.
    Eine ID ist vom Typ Integer, und die wird halt nicht als CheckboxColumn angezeigt.

    Am einfachsten ist auswählen immer, wenn die Datensätze eine Spalte "IstAusgewählt" haben. Darauf kann man auch schön filtern, und hat gleich die Ausgewählten zur Weiterverarbeitung.
    Das ist aber aus Datenbänker-Sicht nicht sehr schön, denn die DB interessierts nicht, was ein User grad ausgewählt hat.

    Ich hab einen dolle Workaround gebastelt, der temporäre Tabellen im typDataset anlegt, welche auf die ausgewählten Datensätze verweisen. Damit - und mit einer berechneten Spalte kriegt mans datenbänkerisch sauber hin.
    Ist aber bisserl advanced: allgemeine Zugriffs-Lösung für: MySql, Access, SqlCe, SqlServer, DatasetOnly