I need to do a dropdownlist with optgroup. I found lots of guides and all foresee the use of WebControlAdapter this is the guide that I'm fllowing
I've added the class to my project:
namespace admin { 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(); } } }
I've added the folder App_Browser to my project (did not exist) and I've added the file BrowserFile.browser
<browsers> <browser refID="IE6to9"> <controlAdapters> <adapter controlType="System.Web.UI.WebControls.DropDownList" adapterType="admin.DropDownListAdapter" /> </controlAdapters> </browser> </browsers>
in my page .aspx (that is in the same folder of the class DropDownListAdapter I have
<asp:DropDownList runat="server" ID="ddlModelli" CssClass="form-control multipleSelect"></asp:DropDownList>
that is filled in this way
public static void loadDDLModelli(ref DropDownList ddl, List<dynamic> objects) { Int16 cont = 0; ddl.Items.Clear(); System.Web.UI.WebControls.ListItem li; String idModello = ""; String nomeModello = ""; String nomeBrand = ""; String oggetto = ""; foreach (var item in objects) { oggetto = item.ToString().Replace("{", "").Replace("}", ""); idModello = oggetto.Split(',')[0].Split('=')[1].Trim(); nomeModello = oggetto.Split(',')[1].Split('=')[1].Trim(); nomeBrand = oggetto.Split(',')[2].Split('=')[1].Trim(); li = new System.Web.UI.WebControls.ListItem(nomeBrand+" - "+nomeModello, idModello); li.Attributes["OptionGroup"] = nomeBrand; ddl.Items.Add(li); cont++; } }
the problem is that, when I watch the source code I do not have the optgroup tag but only options tag.
In fact, if I put a breakpoint in the first line of the method RenderContents this doesn't fire. What I'm doing wrong?
Source : https://forums.asp.net/t/2127882.aspx?Dropdownlist+with+optgroup+using+WebControlAdaptershttps://www.codeproject.com/Articles/15505/ASP-NET-DropDownList-with-OptionGroup-support