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

后端 未结 10 1136
遇见更好的自我
遇见更好的自我 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 10:48

    I prefered a client script solution to avoid the complications at postback, so i solved it like this. Here I use an ordinary html select just to show it in function, but it works with ASP DropDownList too:

    <script>
    function addOptGrp() {
      var t, p
      for (var i = 0; i < arguments.length; i=i+2) {
        t=arguments[i];
        p=arguments[i+1]-i/2;
        var scripts = document.getElementsByTagName('script');
    /* On the next line scripts[scripts.length - 1] is the last script 
       in the page, which by definition will always be the calling script, 
       no matter how many such scripts you have */
        var ddl = scripts[scripts.length - 1].previousElementSibling;
        var og = document.createElement("optgroup");
        og.label = t;
        ddl.add(og,p);
        ddl.selectedIndex = ddl.selectedIndex // needed for UI;
      }
    }
    </script>
    
    <select style="width:100px;">
      <option>Apple</option>
      <option>Pear</option>
      <option>Banana</option>
      <option>Orange</option>
    </select>
    <!-- here I just add the option groups in a script that immediately executes. 
         Notice that the script must follow immediately after the select (or DropDownList) -->
    <script>addOptGrp(
      'Simple fruits', 0,
      'Very exotic fruits', 3
    )</script>
    <br><br>
    
    <!-- Here comes another one -->
    <select style="width:100px;">
      <option>Red</option>
      <option>Blue</option>
      <option>Yellow</option>
      <option>Green</option>
      <option>Magenta</option>
      <option>White</option>
    </select>
    <script>addOptGrp(
      'Some colors', 0,
      'Some more colors', 4
    )</script>

    This function fulfilled the needs I had today. Another day one might need to use a modified version, for example where it converts ordinary options to optgroups, depending on some prefix or so.

    0 讨论(0)
  • 2020-11-28 10:52
    ----- in .cs  -----
    
    List<SelectListItem> sl = new List<SelectListItem>();
    
    sl.Add(new SelectListItem() { Text = "My text", Value = "1", Group = new SelectListGroup() { Name = "First Group" } });
    
    sl.Add(new SelectListItem() { Text = "My text 2", Value = "2", Group = new SelectListGroup() { Name = "First Group" } });
    
    var sl1 = new SelectList(sl,"Value","Text","Group.Name",-1);
    
    ViewData["MyList"] = sl1;
    
    
    ----- in .cshtml    -----
    Html.DropDownList("My List", ViewData["MyList"] as SelectList,
                            "-- No Preference --",
                            new {
                                @class = "ui-widget ui-corner-all square_corners searchPageDropdown"
                            }))
    
    0 讨论(0)
  • 2020-11-28 10:52

    1) Add the dropdownlist adapter class from here to your project

    2) Add App_Browsers folder to your project(right click on project => Add => Add ASP.NET folder => App_Browsers)

    3) Add a browser file into App_Browsers page and add the following code below inside browsers tag.

    <browser refID="WebKit"> <controlAdapters> <adapter controlType="System.Web.UI.WebControls.DropDownList" adapterType="YourAdapterClasse'sNameSPace.DropDownListAdapter" /> </controlAdapters> </browser>

    refId = WebKit supports chrome and safari browsers

    4) Then you can add items to your dropdownlist ListItem item1 = new ListItem("Smith Street", "1"); item1.Attributes["OptionGroup"] = "Darwin";

                ListItem item2 = new ListItem("Mitchel Street", "1");
                item2.Attributes["OptionGroup"] = "Darwin";
    
                ListItem item3 = new ListItem("Hunter Street", "2");
                item3.Attributes["OptionGroup"] = "Sydney";
    
                ListItem item4 = new ListItem("BroadwaY", "4");
                item4.Attributes["OptionGroup"] = "Sydney";
    
                venuedropdown.Items.Add(item1);
                venuedropdown.Items.Add(item2);
                venuedropdown.Items.Add(item3);
                venuedropdown.Items.Add(item4);
    
    0 讨论(0)
  • 2020-11-28 11:01

    I really like this client-side solution (doesn't need a custom DropDownList, but uses jQuery):

    backend

    private void _addSelectItem(DropDownList list, string title, string value, string group = null) {
       ListItem item = new ListItem(title, value);
       if (!String.IsNullOrEmpty(group))
       {
           item.Attributes["data-category"] = group;
       }
       list.Items.Add(item);
    }
    
    ...
    _addSelectItem(dropDown, "Option 1", "1");
    _addSelectItem(dropDown, "Option 2", "2", "Category");
    _addSelectItem(dropDown, "Option 3", "3", "Category");
    ...
    

    client

    var groups = {};
    $("select option[data-category]").each(function () {
         groups[$.trim($(this).attr("data-category"))] = true;
    });
    $.each(groups, function (c) {
         $("select option[data-category='"+c+"']").wrapAll('<optgroup label="' + c + '">');
    });
    
    0 讨论(0)
  • 2020-11-28 11:04

    Check out this article, I too had need for Group DropDown list . . .

    ASP.NET DropDownList with OptionGroup support

    Usage :

    protected void Page_Load(object sender, EventArgs e) 
    {
    
                  ListItem item1 = new ListItem("Camel", "1");
                  item1.Attributes["OptionGroup"] = "Mammals";
    
                  ListItem item2 = new ListItem("Lion", "2");
                  item2.Attributes["OptionGroup"] = "Mammals";
    
                  ListItem item3 = new ListItem("Whale", "3");
                  item3.Attributes["OptionGroup"] = "Mammals";
    
                  ListItem item4 = new ListItem("Walrus", "4");
                  item4.Attributes["OptionGroup"] = "Mammals";
    
                  ListItem item5 = new ListItem("Velociraptor", "5");
                  item5.Attributes["OptionGroup"] = "Dinosaurs";
    
                  ListItem item6 = new ListItem("Allosaurus", "6");
                  item6.Attributes["OptionGroup"] = "Dinosaurs";
    
                  ListItem item7 = new ListItem("Triceratops", "7");
                  item7.Attributes["OptionGroup"] = "Dinosaurs";
    
                  ListItem item8 = new ListItem("Stegosaurus", "8");
                  item8.Attributes["OptionGroup"] = "Dinosaurs";
    
                  ListItem item9 = new ListItem("Tyrannosaurus", "9");
                  item9.Attributes["OptionGroup"] = "Dinosaurs";
    
    
                  ddlItems.Items.Add(item1);
                  ddlItems.Items.Add(item2);
                  ddlItems.Items.Add(item3);
                  ddlItems.Items.Add(item4);
                  ddlItems.Items.Add(item5);
                  ddlItems.Items.Add(item6);
                  ddlItems.Items.Add(item7);
                  ddlItems.Items.Add(item8);
                  ddlItems.Items.Add(item9);
    
              }
    
    0 讨论(0)
  • 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<ListItem>()
                          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:

    <asp:ListItem Value="apple" Text="Apple" Group="Fruit"></asp:ListItem>
    <asp:ListItem Value="banana" Text="Banana" Group="Fruit"></asp:ListItem>
    <asp:ListItem Value="asparagus" Text="Asparagus" Group="Vegetable"></asp:ListItem>
    <asp:ListItem Value="eggs" Text="Eggs" Group="Dairy"></asp:ListItem>
    

    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.

    0 讨论(0)
提交回复
热议问题