How can I add option groups in ASP.NET drop down list?

后端 未结 10 1198
遇见更好的自我
遇见更好的自我 2020-11-28 10:22

I have a requirement of grouping the drop down list options in ASP.NET drop down server control. Do you have any idea to how to approach the issue? I am new to ASP.NET.

10条回答
  •  伪装坚强ぢ
    2020-11-28 11:04

    This is old but since I used the accepted answer recently I wanted to share my experience with it. While it does provide the correct markup, it caused problems for me, specifically whenever I tried to submit a form with any dropdownlist I would get the dreaded "Invalid postback or callback argument" error. After googling like a maniac, I came across this article which then links to this blog post. The code I ended up using was this:

        public class DropDownListAdapter : System.Web.UI.WebControls.Adapters.WebControlAdapter {
        protected override void RenderContents(HtmlTextWriter writer) {
    
            var dropDownList = (DropDownList)Control;
            var items = dropDownList.Items;
    
            var groups = (from p in items.OfType()
                          group p by p.Attributes["Group"] into g
                          select new { Label = g.Key, Items = g.ToList() });
    
            foreach (var group in groups)
            {
                if (!String.IsNullOrEmpty(group.Label))
                {
                    writer.WriteBeginTag("optgroup");
                    writer.WriteAttribute("label", group.Label);
                    writer.Write(">");
                }
    
                var count = group.Items.Count();
                if (count > 0)
                {
                    var flag = false;
                    for (var i = 0; i < count; i++)
                    {
                        var item = group.Items[i];
    
                        writer.WriteBeginTag("option");
                        if (item.Selected)
                        {
                            if (flag)
                            {
                                throw new HttpException("Multiple selected items not allowed");
                            }
                            flag = true;
    
                            writer.WriteAttribute("selected", "selected");
                        }
    
                        if (!item.Enabled)
                        {
                            writer.WriteAttribute("disabled", "true");
                        }
    
                        writer.WriteAttribute("value", item.Value, true);
    
                        if (Page != null)
                        {
                            Page.ClientScript.RegisterForEventValidation(dropDownList.UniqueID, item.Value);
                        }
                        writer.Write('>');
                        HttpUtility.HtmlEncode(item.Text, writer);
                        writer.WriteEndTag("option");
                        writer.WriteLine();
                    }
                }
                if (!String.IsNullOrEmpty(group.Label))
                {
                    writer.WriteEndTag("optgroup");
                }
            }
        }
    }
    

    The listitems used here are created in the design page rather than the code-behind page like so:

    
    
    
    
    

    This produced the same markup as the accepted answer here but this didn't give me the postback error. I hope this saves someone some grief.

提交回复
热议问题