Bug oder Feature - DataBinding der CheckBoxList

Zugriffe: 3598 starstarstarstarstarstarstarstarstarstar Bewertung:2,86 (7 Bewertungen) 13.09.2009

Im Rahmen meiner beruflichen Tätigkeit war es wieder mal so weit, sich mit der Entwicklung von Custom Controls näher auseinander zu setzen. Custom Controls bieten dabei aus meiner Sicht einen unschätzbaren Vorteil: über das Control kann man allen Benutzern des selben so klare Vorgaben machen, dass das Endergebnis im Webprojekt auch wirklich immer gleich aussieht. So kann man "frecherweise" bestimmte Eigenschaften so setzen, dass sie bewußt überschrieben werden. Aber das soll heute nicht das eigentliche Thema sein.

Bei der Planung des Custom Control - und wer immer sich damit beschäftigen will - ist es stets hilfreich, sich doch einmal mit den Grundlagen der Controlentwicklung zu beschäftigen. Einen etwas älteren - aber immer noch aktuellen - Ansatz bietet hierbei der Webcast von Daniel Walzenbach. Um es an dieser Stelle gleich vorweg zu nehmen, es bleibt vieles in der Webcastserie an der Oberfläche und beschränkt sich i.d.R. auf diverse Samples, welche man auch in der MSDN-Sammlung wiederfindet. Dennoch ist diese Webcastserie meines Erachtens unverzichtbar beim Einstieg in die Controlentwicklung.

Wer schon mal die Controls von Infragistics oder vom AjaxToolkit eingesetzt hat, dem dürften diverse verschachtelte Controls aufgefallen sein. Daniel Walzenbach erklärt in seiner Webcastserie sehr ausführlich, wie man dieses Verhalten umsetzen kann. Am Ende werden zu den Properties bestimmte Attribute gesetzt.

PropertyAttribute

Vor diesem Hintergrund kam mir der Gedanke: warum soll ich alles von Hand implementieren, wenn ich doch gleich ein .NET-Webcontrol als Nested-Control verwenden kann. Was mit einer Property vom Type Style geht, sollte auch mit einer TextBox oder einer CheckBoxList funktionieren.

Und in der Tat - es funktioniert. Somit konnte ich mir sehr viel Arbeit ersparen (welche Daniel Walzenbach im Webcast noch für zwingend erforderlich hielt).

Nun waren noch die Punkte des Postback-Verhalten und der Datenbindung zu klären. Man möchte nun meinen, dass die Standardwebcontrols alles implementiert haben? Ja und nein - den IPostBackDataHandler muss man trotzdem im Custom Control implementieren. Was man aber nicht mehr benötigt, ist die detailierte Vorgehensweise, wie sie vom Daniel im Webcast beschrieben wurde - zumindest nicht, soweit es die Standardwebcontrols betrifft. Hier genügt es in der LoadPostData-Methode den Wert true zurück zu geben.

LoadPostDataDefault

Für alle anderen Fälle bleibt es dabei, dass die Werte verglichen werden müssen.(siehe unten)

Ein weiterer Punkt ist die Datenbindung. Hier bin ich fast verzweifelt. Am Ende stellte sich die Frage, wieso gibt es hierfür keine vernünftige Implementierung im .NET-Framework? Doch was ist geschehen: Nehme ich ein List-Steuerelement, w.z.B. eine CheckBoxList und binde sie an eine Datenquelle, dann passiert das i.d.R. folgendermaßen:

DataBinding

Man möchte meinen, dass der Checked-Status der einzelnen Elemente aus der Datenquelle übernommen wird. Aber weit gefehlt. Erstaunlicherweise hatte sich Peter Bucher mit diesem Thema schon einmal auseinander gesetzt und es scheint mir die derzeit plausibelste Vorgehensweise für dieses Problem.

Im Rahmen der Custom Control Entwicklung wollte ich jetzt nicht noch ein Custom Control ins Spiel bringen, zu mal ich ja direkten Einfluss auf den Renderprozess des Controls (der CheckBoxList) habe. Folglich habe ich mich für einen anderen Weg entschieden - der z.T. durch das Projekt mit bedingt war.

Das Rendern der CheckBoxList habe ich selbst übernommen und so direkten Einfluss auf die Eigenschaften der einzelnen CheckBox genommen. Orientiert habe ich mich am Renderprozess des CheckBoxList-Control selbst.

Um den Checked-Status der CheckBoxen richtig setzen zu können, habe ich dem Custom Control eine Property zugewiesen, welche die einzelnen Werte separiert verwaltet, zuzüglich einer Eigenschaft für den Delimiter.

RenderControl

Zu guter Letzt musste ich mich nur noch um den PostBack kümmern. Hierzu habe ich dann in der LoadPostData-Methode folgende Codezeilen eingefügt:

LoadPostDataSpezial

Analog ist dann auch die Vorgehensweise beim DropDownList-Control, wenn denn die Mehrfachauswahl zugelassen ist.

Es bleibt aber zu hoffen, dass dieses Manko - und das ist es in der Tat - in eine der nächsten Versionen allgemeingültig behoben ist.


Neuen Kommentar verfassen

Bestätigungscode