Eintraege der CheckBoxList beim Databinding vorselektieren
Beim CheckBoxList Control gibt es die Eigenschaften DataTextField und DataValueField, diese dienen dazu das jeweils angegebene Feld an die Text- und Value Eigenschaft eines CheckBox Items (ListItem) zu binden.
Die Klasse ListItem sowie auch die Html Repräsentation haben noch eine zusätzliche Eigenschaft als Indikator ob der Eintrag selektiert ist oder nicht.
Da wäre es doch passend zu den schon vorhandenen Eigenschaft, eine zusätzliche Eigenschaft "DataSelectedField" und somit die Möglichkeit haben, die schon vorhandene Selektierung aus der Datenbank, XML oder einer anderen Datenquelle direkt zu binden.
out-of-the-box gibt es da keine Möglichkeit, es bleibt also nur der Ausweg, alle ListItems noch einmal durchzugehen, die Selektierung zu setzen bzw. gleich die gesamten Daten manuell an die CheckBoxList zu binden.
Nun, das muss doch noch einfacher gehen? Ja, das tut es auch!
Die Lösung ist an dieser Stelle ein CustomControl das diese zusätzliche Eigenschaft besitzt und natürlich auch dementsprechend umsetzt.
Zusätzlich zur Vorselektierung habe ich ein ItemDataBound Event implementiert, um den Text, die Value oder den Checked Zustand zu manipulieren.
Mir fällt hierzu im Moment kein sinnvolles Beispiel ein, jedoch stellt das gleichzeitig auch ein Beispiel dar, wie ein eigener Event implementiert werden kann.
Hauptbestandteil der Implementation ist die überschriebene PerformDataBinding Methode der Klasse ListControl.
Im ersten Schritt übergebe ich die DataSource an die Methode der Basisklasse, damit diese das _normale_, schon implementierte DataBinding ausführt.
Als zweiter Schritt übergebe ich die DataSource an meine eigene Methode, die die Selektion vornimmt.
Das funktioniert soweit bei normalen DataSources wunderbar. Wird jedoch an ein Objekt vom Typ "IDataReader" gebunden, stösst man hier auf das Problem, das ein DataReader nur einmal durchlaufen werden kann / darf.
Meine Lösung Workaround ist hierbei ein kopieren der DataSource in eine generische Liste, die Objekte vom Typ "object" hält. Diese wird dann jeweils an diese zwei Methoden übergeben.
Falls hier jemandem eine bessere / saubere Lösung einfällt, bin ich natürlich daran interessiert :-)
Das Beispielprojekt enthält das CustomControl und ein Web Application Project mit jeweils einem Databinding gegen eine Xml Datei (XmlDataSource) und eine Sql Datenbank (IDataReader).
Beispielprojekt:
PS: Danke an Norbert für den Hinweis zum Workaround für IDataReader Datenquellen.