DevTrain

Autor: Hannes Preishuber

Windows Listbox mit Auswahl

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.


Erfasst am: 03.04.2003 - Artikel-URL: http://www.devtrain.de/news.aspx?artnr=838
© Copyright 2003 ppedv AG - http://www.ppedv.de