Der Editor für DevTrain wird gerade nach VB.NET Windows portiert. Dabei zeigt sich wieder einmal, dass man mit super wenig code ein Problem lösen kann. Konkret wir die CheckedListBox verwendet um die Kategorien aus DevTrain auszuwählen.
Da die Daten aus einer SQL Tabelle kommen müssen zunächst die Namespaces eingebaut werden.
imports system.data imports system.data.sqlclient |
Dann wird das Control aus der Werkzeugleiste auf die Form gezogen. Das erzeugt folgenden Eintrag im Code.
Friend WithEvents chkForen As System.Windows.Forms.CheckedListBox |
Als nächstes öffnen wir eine Connection um die Daten zu holen. Das SQL Kommando wird dem Dataadapter übergeben. Dieser holt per Fill die Daten und legt sie in das Dataset. Das wars auch schon, noch schnell die Connection wieder zu und fertig.
Dim MyConn As SqlConnection MyConn = New SqlConnection("server=localhost;database=startdb;user id=sa;password= ") MyConn.Open() Dim sql As String = "select id,thema from themen" Dim ds As New DataSet Dim cmd As New SqlDataAdapter(sql, MyConn) cmd.Fill(ds, "themen") myconn.close |
Nun zur Datenbindung. Windows Forms Controls können über die Eigenschaft Datasource an Daten gebunden werden. Da sich im Dataset durchaus mehrere Tabellen rumtreiben können, wird aus der Tables Collection die erste (=0) Table genommen.
Defaultview gibt an, das keine Filterung oder Sortierung aktiv ist. Um festzulegen welches Feld in Der Liste schlussendlich angezeigt werden soll muss ncoh das Proberty Displymember gesetzt werden. Im Unterschied zu den Webform Controls ist hie rkein weiteres Databind nötig.
chkForen.DataSource = ds.tables(0).defaultview chkForen.DisplayMember = "thema" |
Wenn der Benutzer alles ausgewählt hat und z.B auf einen Button Speichern klickt, möchte man gerne Wissen was ausgewählt wurde um es z.B. in eine Tabelle zu speichern.
Hier leistet for Each wertvolle Dienste um durch die CheckedItems Collection zu steppen. Alternitv wäre auch ein for next mit Count möglich.
So wird für jeden gewählten Eintrag die Datarow zugwiesen und ist entsprechend auch wieder lesbar. Dazu einfach das erste Item (= erstes Feld) in einen String umwandeln:
FERTIG
Dim eintrag As Object Dim id As Integer For Each eintrag In chkForen.CheckedItems id = CInt(eintrag.item(0).ToString()) MsgBox(id) Next |
Fazit: kürzester Code - geiles Ergebnis.