Click here to Skip to main content
Click here to Skip to main content

ASP.NET DropDownList with OptionGroup support

, 12 Sep 2006
Rate this:
Please Sign up or sign in to vote.
An implementation of a DropDownList Control Adapter which provides OptionGroup support.

Introduction

ASP.NET 2.0, for all its bells and whistles, lacks the odd bit of functionality for reasons completely unknown. One such notable omission is that of OptionGroup (<optgroup>) support in the DropDownList control. For those unfamiliar with the <optgroup> element, it is part of the XHTML standard, and has the effect of categorising items in a <select>, as the following image shows.

Option Groups

When I first began to look for a solution to implement this in ASP.NET, I found very few articles on the topic that offered any viable solution. Another CodeProject member came up with a nice clean solution, but it looked like a lot of code and I was convinced there was an easier way. After reading some comments, it became apparent a Control Adapter was the way to go. Control Adapters are new in ASP.NET 2.0, and allow the developer to override the rendering behaviour of any control, very powerful stuff! Furthermore, Control Adapters are used in conjunction with a browser file, so specific browsers may be targeted, if required. Armed with that knowledge, the solution became simple. The attached download contains the requisite files to implement this solution in your own projects, but for posterity, I paste it here also.

public class DropDownListAdapter : 
       System.Web.UI.WebControls.Adapters.WebControlAdapter {
    protected override void RenderContents(HtmlTextWriter writer) {
        DropDownList list = this.Control as DropDownList;
        string currentOptionGroup;
        List<string> renderedOptionGroups = new List<string>();
        foreach(ListItem item in list.Items) {
            if(item.Attributes["OptionGroup"] == null) {
                RenderListItem(item, writer);
            } else {
                currentOptionGroup = item.Attributes["OptionGroup"];
                if(renderedOptionGroups.Contains(currentOptionGroup)) {
                    RenderListItem(item, writer);
                } else {
                    if(renderedOptionGroups.Count > 0) {
                        RenderOptionGroupEndTag(writer);
                    }
                    RenderOptionGroupBeginTag(currentOptionGroup, 
                                              writer);
                    renderedOptionGroups.Add(currentOptionGroup);
                    RenderListItem(item, writer);
                }
            }
        }
        if(renderedOptionGroups.Count > 0) {
            RenderOptionGroupEndTag(writer);
        }
    }
    private void RenderOptionGroupBeginTag(string name, 
                 HtmlTextWriter writer) {
        writer.WriteBeginTag("optgroup");
        writer.WriteAttribute("label", name);
        writer.Write(HtmlTextWriter.TagRightChar);
        writer.WriteLine();
    }
    private void RenderOptionGroupEndTag(HtmlTextWriter writer) {
        writer.WriteEndTag("optgroup");
        writer.WriteLine();
    }
    private void RenderListItem(ListItem item, 
                 HtmlTextWriter writer) {
        writer.WriteBeginTag("option");
        writer.WriteAttribute("value", item.Value, true);
        if(item.Selected) {
            writer.WriteAttribute("selected", "selected", false);
        }
        foreach(string key in item.Attributes.Keys) {
            writer.WriteAttribute(key, item.Attributes[key]);
        }
        writer.Write(HtmlTextWriter.TagRightChar);
        HttpUtility.HtmlEncode(item.Text, writer);
        writer.WriteEndTag("option");
        writer.WriteLine();
    }
}

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

lotuspro
Web Developer
United Kingdom United Kingdom
No Biography provided

Comments and Discussions

 
NewsError while Try to run sample PinmemberDinesh Balaji24-Jun-14 3:26 
GeneralRe: Error while Try to run sample Pinmembersfjaffer16-Sep-14 3:17 
GeneralMy vote of 1 PinmemberMember 100194966-Jun-14 5:15 
SuggestionEnabling the code for listbox PinmemberMichael Demeersseman24-Nov-13 21:24 
QuestionIdeally you should include the code in a working Visual Studio Project Pinmemberliran bar niv24-Oct-13 10:14 
AnswerRe: Ideally you should include the code in a working Visual Studio Project PinprofessionalPIEBALDconsult24-Oct-13 11:14 
Bugnot working Pinmemberbhawana13198918-Jul-12 19:02 
Suggestion&lt;optgroup&gt; support with ASP.net web componenets - An alternate way PinmemberShan Veerakutty12-Sep-11 9:55 
GeneralRe: <optgroup> support with ASP.net web componenets - An alternate way Pinmemberfengjunkuan20062-Jul-12 23:07 
QuestionBinding data from Db Pinmembersudheshna1235-Aug-11 20:46 
GeneralCan you specific a license or terms or use... Pinmemberhhearst24-Apr-11 3:53 
GeneralRe: Can you specific a license or terms or use... Pinmemberlotuspro25-Apr-11 11:07 
GeneralDropdowlist with optiongroup support using ajax PinmemberMember 452360631-Aug-10 0:43 
GeneralListBoxAdapter Pinmembervoleona1-Feb-10 12:51 
QuestionEvent validation errors PinmemberMember 446930417-Aug-09 9:00 
AnswerRe: Event validation errors PinmemberKishore.ssit7-Dec-09 21:31 
AnswerRe: Event validation errors PinmemberSean_ST2-Sep-10 11:55 
GeneralRe: Event validation errors PinmemberMember 392364420-Oct-10 17:18 
GeneralVB Version Pinmemberianbenoliel17-Feb-09 3:14 
QuestionUse of your code in VS2008 PinmemberMember 437824011-Feb-09 2:56 
AnswerRe: Use of your code in VS2008 Pinmemberlotuspro11-Feb-09 3:20 
AnswerRe: Use of your code in VS2008 PinmemberMember 437824011-Feb-09 4:29 
Generaloptgroup style change PinmemberJay K R8-Oct-08 18:51 
AnswerRe: optgroup style change PinmemberCaptainRantflaps12-Nov-08 23:24 
Questioncombination of ungroup item [modified] Pinmemberpaidinjav16-Sep-08 23:07 
AnswerRe: combination of ungroup item PinmemberMember 195472715-Dec-08 2:11 
GeneralRe: combination of ungroup item PinmemberSameers (theAngrycodeR )29-Mar-10 1:08 
Generaloptgroup structure disappears after PostBack PinmemberMember 37370022-Sep-08 3:30 
GeneralRe: optgroup structure disappears after PostBack PinmemberLamester17-Jun-09 13:51 
GeneralRe: optgroup structure disappears after PostBack PinmemberVipul12345626-Apr-10 19:57 
GeneralRe: optgroup structure disappears after PostBack Pinmemberridgie20-Jul-10 16:52 
GeneralDrop Down list bind to sql server Pinmemberbismillah131-Aug-08 20:27 
GeneralOnSelectedIndexChanged event not working PinmemberRashuD5-Feb-08 4:30 
GeneralRe: OnSelectedIndexChanged event not working PinmemberMember 465139911-Aug-08 20:20 
GeneralRe: OnSelectedIndexChanged event not working PinmemberSivaPrakasamDotNet16-Jul-09 23:33 
GeneralRe: OnSelectedIndexChanged event not working PinmemberMember 979468529-Jan-13 23:28 
QuestionMore than one level??? Pinmemberlatiful8-Sep-07 0:33 
Generalchange of Font Style optgroup element Pinmemberaf_shamim23-Aug-07 13:01 
AnswerRe: change of Font Style optgroup element Pinmemberlotuspro23-Aug-07 23:06 
GeneralRe: change of Font Style optgroup element PinmemberNayeem Yahoo16-Jan-09 2:24 
GeneralRe: change of Font Style optgroup element PinmemberGilesHinton2-Aug-10 5:46 
GeneralUpdate to RenderContents PinmemberPedro Maia Costa20-Jul-07 1:05 
QuestionList get added again after postback Pinmemberxsoftdev19-Jul-07 5:20 
AnswerRe: List get added again after postback PinmemberPedro Maia Costa20-Jul-07 1:07 
GeneralVB version anyone... Pinmemberjaywoncoder10-May-07 12:46 
AnswerVB version with fixes below... PinmemberWolfyUK20-Jun-07 5:38 
AnswerStandalone version [modified] PinmemberPaul Appeldoorn4-Oct-07 3:53 
GeneralRe: Standalone version PinmemberMember 437800431-Jul-08 20:18 
QuestionRe: VB version with fixes below... [modified] PinmemberCaptainRantflaps12-Nov-08 23:15 
QuestionAjax [modified] Pinmemberdavidprice3520-Mar-07 5:09 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web02 | 2.8.141022.2 | Last Updated 12 Sep 2006
Article Copyright 2006 by lotuspro
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid