24 Nov
2006

optgroup bei DropDownList via ControlAdapter

 

Leider hat es MS ja mit ASP.NET 2.0 nicht geschafft auch <optgroup /> zu unterstützen. Damit könnte man die Einträge innerhalb DropDownList gruppieren. Dies würde dann so aussehen.

Dies kann man jedoch leicht nachrüsten, entweder mit einem eigenen Control oder mit einem Adapter. Wie? Das soll hier gezeigt werden. ControlAdapter sind eine ganz nette Erfindung von Microsoft, damit kann man das verhalten der eingebauten Controls überschreiben. Den Weg über den ControlAdapter hat jemand bei The Code Project [1] vollzogen.

Leider hat die veröffentliche Variante einige Probleme beim Postback, da keinerlei Viewstate verwaltet wird, und somit die Validierung nicht möglich ist und die Gruppierung verloren geht. Ich habe das ganze ein wenig aufgeräumt, die Viewstate Unterstützung eingebaut und es ist was brauchbares dabei rumgekommmen, warum soll es also weiter nur auf meiner Festplatte versauern. Die Anwendung ist denkbar einfach, ein vorhandenes ListItem muss einfach um das Attribute "optionGroup" mit dem Namen der Gruppe erweitert werden. Dies entweder direkt im Markup-Code

<asp:DropDownList id="foo" runat="server" />
<asp:ListItem optionGroup="Gruppe1">Eintrag 1</asp:ListItem>
<asp:ListItem optionGroup="Gruppe1">Eintrag 2</asp:ListItem>
<asp:ListItem optionGroup="Gruppe2">Eintrag 3</asp:ListItem>
<asp:ListItem optionGroup="Gruppe2">Eintrag 4</asp:ListItem>
<asp:ListItem optionGroup="Gruppe3">Eintrag 5</asp:ListItem>
<asp:ListItem optionGroup="Gruppe3">Eintrag 6</asp:ListItem>
<asp:ListItem optionGroup="Gruppe3">Eintrag 7</asp:ListItem>
<asp:ListItem optionGroup="Gruppe4">Eintrag 8</asp:ListItem>
</asp:DropDownList>

oder via Programm-Code

ListItem item = new ListItem();
item.Attributes["optionGroup"] = "Gruppe1"; 

In diesem ControlAdapter wird RenderContents() um die ListItems entsprechend zu rendern und in eine <optgroup /> zu packen. Für den ViewState wird dann noch LoadAdapterViewState() und SaveAdapterViewState() überschrieben. Wichtig ist dann noch nach dem wiederherstellen nach dem laden des ViewsStates die optionGroup Einstellungen wieder herzustellen, die passiert passenderweise in OnPreRender(). Damit die Event Validierung nicht fehlschlägt muss jeder Wert der ListItems noch mit Page.ClientScript.RegisterForEventValidation() registriert werden. Der ControlAdapter dann einfach nur noch in die Webanwendung einbauen. Dazu die beigefügte DropDownList.browser Datei in den Ordner App_Browsers ablegen, ist dieser nicht da, dann einfach anlegen. Viel Spaß.


[1] http://www.codeproject.com/aspnet/DropDownListOptionGroup.asp

[2] http://der-albert.com/uploads/DropDownListAdapter.zip


Der Eintrag ist mir etwas Wert
 

Feedback

# re: optgroup bei DropDownList via ControlAdapter

left by Christian at 4/21/2008 4:14 PM Gravatar
Coole Sache!
Comments have been closed on this topic.