Einleitung

Als Entwickler, der regelmäßig mit VB.net arbeitet, bin ich kürzlich auf eine interessante Herausforderung gestoßen. Obwohl ich bisher selten die CheckedListBox verwendet habe, bot sich diese Komponente für mein aktuelles Projekt perfekt an. Im Folgenden möchte ich meine Erfahrungen teilen und einige fortgeschrittene Techniken vorstellen, die über das bloße Hinzufügen und Überprüfen von Elementen hinausgehen.

Grundlagen der CheckedListBox

Die CheckedListBox in VB.net ist ein Steuerelement, das eine Liste mit integrierten Checkboxen darstellt. Es ist vergleichbar mit einem ListView mit aktivierten Checkboxen (Me.myListView.CheckBoxes = True), bietet aber einige zusätzliche Funktionen und Anwendungsmöglichkeiten.

Hinzufügen von Elementen

Prinzipiell funktioniert das Hinzufügen wie gewöhnlich

> Me.CheckedListBox.Items.Add(strLine)

Elemente können standardmäßig zur CheckedListBox hinzugefügt werden.

Textdatei2CheckListBox

Zum Beispiel das Einlesen einer Textdatei:

Hinzufügen einzelner Elemente

Um ein einzelnes Element, beispielsweise von einer Textbox anzufügen würde folgendes funktionieren

Alle Elemente markieren

Manchmal möchte man alle Elemente in einer CheckedListBox markieren. Dies kann wie folgt erreicht werden:

Die Methode 1 stellt auch die gängigste Vorgehensweise generell in Bezug auf eine CheckListBox dar. Das durchlaufen aller Elemente anhand ihres Index.

Auswahl invertieren

Ein weiteres öfters mal benötigtes Snipplet ist die Invertierung der Auswahl. maW. Man möchte, dass die angehackten Checkboxen als nicht angehackt aufscheinen und umgekehrt. Auch das geht recht einfach.

ausgewählte (angehackte) Elemente ausgeben

Nachdem man nun bestimmte Elemente ausgewählt hat indem man sie angehackt hat, stellt sich die Frage, wie man zu den Werten der ausgewählten Einträge kommt. Hierzu gibt es mehrere Möglichkeiten

aktuell ausgewähltes Elemente ausgeben

Im Gegensatz zur CheckedItems-Eigenschaft gibt es in der CheckedListbox auch die Eigenschaft SelectedItems. Dabei handelt es sich um das aktuell selektierte Element (blau hinterlegt). Dieses muss nicht Bestandteil der CheckedItems sein. Eine Mehrfachauswahl ist jedoch bei der CheckedListbox nicht möglich. Daher erscheint die CheckedItems verwirrend, da es ein Plural darstellt. Aber egal. 

Grundsätzlich ist die CheckedListbox so eingestellt, dass man zwei Mal auf ein Listenelement klicken muss, damit es angehackt ist. Der erste Klick selektiert das Element (dh. es ist blau hinterlegt) und erst der Zweite setzt die Checked-Eigenschaft. Man kann dies jedoch unter den CheckedListbox Eigenschaften umstellen. Dafür ist die CheckOnClick Eigenschaft verantwortlich. Ist diese auf True gesetzt, dann reicht ein Klick auf das Element und sowohl die Eigenschaft Checked und Selected sind für das Element erfüllt. In diesem Fall ist das Selected Item Bestandteil der Checked Items.

mehr Informationen zu einem Element speichern

Am Anfang mag man meist mit einer CheckedListBox auskommen. Aber was ist, wenn man zusätzliche Informationen zu einem Element speichern möchte. Dann könnte man das ganze irgendwie umbauen, aber das bedeutet meist viel Arbeit. Leute, die sich die Eigenschaften der CheckedListBox ansehen, werden vielleicht auch auf Multicolumn stoßen. Diese Eigenschaft bedeutet aber nicht, dass man mehr Informationen zu einem Element speichern kann, sondern lediglich, dass sobald eine Spalte voll ist, für weitere Elemente eine neue angelegt wird. Das ist übrigens bei der der normalen Listbox auch so. Ich würde das Thema nicht ansprechen, wenn es nicht doch eine Lösung gäbe. Das CheckedListBox-Steuerelement (Control) aktzeptiert jegliche Art von Objekten. Man braucht nur eine Klasse erstellen, die die entsprechenden Daten beinhaltet. Wichtig hierbei ist, dass die Funktion mittels overrides überschrieben wird, da das Element jetzt nicht nur einen String enthält.

Ein Beispiel: Will man die Elemente – wie oben – aus einer Textdatei einlesen, aber zusätzlich noch die Datei von der die Elemente stammen speichern, dann würde man eine zusätzliche Eigenschaft benötigen, die den Pfad der Datei speichert. Eine solche Klasse könnte beispielsweise so aussehen.

Würde man nun die CheckedListBox mit den Informationen der jeweiligen Zeilen und der Pfade versorgen, könnte man das folgendermaßen machen:

Will man nun diese zusätzlich gespeicherten Informationen anzeigen, stellt sich die Frage nach dem Wie. Ich habe es nicht hinbekommen eine Kontextmenü zu den jeweiligen Einträgen anzuzeigen. Wenn man mir auf die Sprünge helfen kann, bitte gerne. Ich habe das schlussendlich über ein weiteres Formular gelöst, das die Daten anzeigt. 

Der Aufruf dieses Formulars erfolgt mittels Übergabe der Objektes. Vorher muss natürlich geprüft werden, ob das Element wirklich von dem Typ ist.

Liste leeren

Zu guter letzt möchte ich nicht unterwähnt lassen, wie man die Liste leeren kann. Hierfür gibt es grundsätzlich zwei Möglichkeiten.

Listenelemente löschen

angekackte Elemente löschen

ausgewähltes Element löschen

Speichern

Ich hätte fast das Speichern vergessen. Also einmal als Speichern unter bereits vorhanden Dateinamen (Variable: myfile) und einmal als Speichern unter.