Checkedlistbox mit Werten aus SQLite füllen

  • VB.NET
  • .NET (FX) 4.0

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

    Checkedlistbox mit Werten aus SQLite füllen

    Hallo zusammen,

    ich versuche gerade, in VB eine SQLite-Datenbank einzubinden (das geht) und Werte an eine CheckedListBox auszugeben.
    In C# hat das geklappt mit folgendem Code:

    Quellcode

    1. private void Reload_List()
    2. {
    3. SQLiteConnection connection = new SQLiteConnection();
    4. connection.ConnectionString = "Data Source=" + database;
    5. connection.Open();
    6. var ausgabeset = new DataSet();
    7. SQLiteDataAdapter adapter = new SQLiteDataAdapter("SELECT id, name FROM " + tablename + " ORDER BY name ASC", connection);
    8. adapter.Fill(ausgabeset, tablename);
    9. this.checkedListBox1.Items.Clear();
    10. for (int i = 0; i < ausgabeset.Tables[tablename].Rows.Count; i++)
    11. {
    12. this.checkedListBox1.Items.Add(ausgabeset.Tables[tablename].Rows[i][1], false);
    13. }
    14. adapter.Dispose();
    15. connection.Close();
    16. connection.Dispose();
    17. }


    Ich lese also die SQL-Datenbank aus und schreibe die Werte in ein Dataset, was dann wiederum in die CheckedListBox schreibt.

    Jetzt nutze ich eine andere Datenbank, siehe hier:


    Ich würde gerne wissen, wie ich es so gestalte, dass ich einer CheckedListBox die ID mitgebe, um zu sehen, welches Element gecheckt wurde, der Name soll der Text der CheckedListBox sein.
    Nun dachte ich mir, dass es keinen Sinn macht, für eine Abfrage ein ganzes DataSet zu nehmen sondern wollte nur eine Datatable nehmen.

    Quellcode

    1. Using connection As New SQLiteConnection
    2. connection.ConnectionString = "Data Source=" + Modul_Global.database
    3. connection.Open()
    4. Using machinetable = New DataTable()
    5. Using adapter = New SQLiteDataAdapter("SELECT 'analysen.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 = 1 AND betriebe.Betrieb = '" + Modul_Global.firma + "' ORDER BY analysen.Name ASC", connection)
    6. adapter.Fill(machinetable)
    7. lb_machines.Items.Clear()
    8. Dim i As Integer
    9. For i = 0 To machinetable.Rows.Count
    10. Me.lb_machines.Items.Add(machinetable.Rows(i)("Name"), False)
    11. Next
    12. End Using
    13. End Using
    14. End Using


    Ich erhalte allerdings eine IndexOutOfRange-Exception: "An der Position 0 befindet sich keine Zeile.". Warum ist das der Fall?
    Lustigerweise funktioniert das gleiche Prinzip aber an einer anderen Stelle einwandfrei (allerdings mit einer DropDownList):

    Quellcode

    1. Private Sub Betriebsauswahl_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Modul_Global.firma = "NULL"
    3. Using connection As New SQLiteConnection
    4. connection.ConnectionString = "Data Source=" + Modul_Global.database
    5. connection.Open()
    6. Using ausgabetable = New DataTable()
    7. Using adapter = New SQLiteDataAdapter("SELECT Betrieb FROM betriebe ORDER BY Betrieb ASC", connection)
    8. adapter.Fill(ausgabetable)
    9. Betriebselector.Items.Clear()
    10. Dim i As Integer
    11. For i = 0 To ausgabetable.Rows.Count
    12. Betriebselector.Items.Add(ausgabetable.Rows(i)("Betrieb"))
    13. Next
    14. End Using
    15. End Using
    16. End Using
    17. End Sub



    Und wie gebe ich am besten die ID weiter? Oder sollte ich es ganz anders angehen? Tut mir Leid, ich bin kein VB-Profi.
    Wenn jemand also einen Tip hat, wäre ich sehr dankbar.

    Gruß
    Broco

    Edit: Ich bin ein Idiot. Bei der For-Schleife zählt bis zur Anzahl der Reihen, aber der Index beginnt ja bei 0. So gehts:

    Quellcode

    1. Dim i As Integer
    2. For i = 0 To (machinetable.Rows.Count - 1)
    3. Me.lb_machines.Items.Add(machinetable.Rows(i)("Name"), False)
    4. Next


    Jedoch die andere Frage: Wie übergebe ich die ID aus der Datenbank an die CheckedListBox Items?

    Also so ähnlich wie in HTML, wo ein Element einen Namen, eine ID und einen Wert hat. Ich muss ja die Items einzeln ansprechen können, auch wenn sie dynamisch sind.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Broco“ ()

    petaod schrieb:

    Broco schrieb:

    i = 0 To ausgabetable.Rows.Count
    ist ein Schleifenschritt zu viel.

    Warum verwendest du nicht Databinding?


    Den Schleifenschritt zuviel hatte ich schon gefunden ^^

    So wie ich CheckedListBox verstanden habe, unterstützt sie gar kein Databinding, deshalb die Schleife. Bzw. DataBinding ist gar nicht vorgesehen.
    Aber ich habs hinbekommen. Werde aber wohl auf DataGrid wechseln, da CheckedListBox den Text nicht umbrechen kann, sondern nur eine horizontale Scrollbar einblenden kann.

    ErfinderDesRades schrieb:

    guck auch mal in vier Views-Videos - spart vlt. ne Menge Arbeit

    Uhm ich versteh nicht ganz, was das im konkreten Fall bringen soll.

    Habs aber jetzt hinbekommen, vielen Dank.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Broco“ ()

    naja, dort wird gezeigt, wie bequem du Databinding bereits im Designer einrichten kannst, und was du damit alles treiben kannst.
    Vorraussetzung ist natürlich eine geeignete Architektur.
    Befüll-Funktionen, die immer neue untypisierte DataTables erzeugen, oder gar ohne DataTables gleich in Listboxen rumfummeln - sowas ist nicht nötig, und ist mittelfristig kaum noch wartbar.
    Und das verbaut die Möglichkeit, die Oberfläche im Designer zu designen.
    Und erzeugt überflüssigen Traffic, Resourcenverbrauch und Fehlerquellen aufgrund von Redundanzen, wenn dieselben Daten mehrmals abgerufen werden, weil man keinen Überblick hat, in welcher DataTable oder Listbox das Zeug bereits geladen ist.
    Ach so... Das ist natürlich sinnvoll und die Videos finde ich auch ziemlich infromativ, aber das ist gar nicht mein Problem gewesen, denn die Datenquelle ist in meinem Fall ja eine SQLite-Datenbank, weshalb die Datatables auch nur temporär sind. Das Joining-View mache ich ja sozusagen auch schon im SQL.

    Das Binding wird auch nur in der einen Form benötigt, es geht eigentlich nur darum, eine Liste mit Checkboxen darzustellen, aus der man einige Punkte auswählt und dann im nächsten Schritt muss wieder die Datenbank befragt werden je nachdem, welche IDs gewählt wurden.
    Ja, da hast du schon recht, nur muss die Datenbank auch anderen (nicht Windows-)Anwendungen zur Verfügung stehen. Deshalb diese Herangehensweise. Trotzdem Danke für den Tipp, für andere Anwendungen wäre das echt Gold wert.