如何在ASP.NET下拉列表中添加选项组?

Aru*_*n C 29 c# asp.net

我需要在ASP.NET下拉服务器控件中对下拉列表选项进行分组.你对如何处理这个问题有任何想法吗?我是ASP.NET的新手.

我的要求.

PaR*_*RaJ 36

看看这篇文章,我也需要Group DropDown列表...

支持OptionGroup的ASP.NET DropDownList

用法:

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);

          }
Run Code Online (Sandbox Code Playgroud)

  • 关于这种方法的一个注意事项是,当它起作用时,您必须实现自定义视图状态逻辑来保存属性并在回发后恢复它们。[如何维护属性](/sf/ask/91941321/) (3认同)

mhu*_*mhu 36

我真的很喜欢这个客户端解决方案(不需要自定义DropDownList,但使用jQuery):

后端

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");
...
Run Code Online (Sandbox Code Playgroud)

客户

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 + '">');
});
Run Code Online (Sandbox Code Playgroud)

  • 如果有多个选择标签(在此示例中,.select2是所有选择标签所共有的类),则mhu的出色解决方案的这一小改进就可以工作。var groups = {}; $(“ select option [data-category]”)。each(function(){var sGroup = $ .trim($(this).attr(“ data-category”)); groups [sGroup] = true;}) ; $ .each(groups,function(c){$(“。select2”)。each(function(){$(this).find(“ option [data-category ='” + c +“']”)。 wrapAll('&lt;optgroup label =“'+ c +'”&gt;');})}); (2认同)

Dou*_*g F 5

这已经过时了,但由于我最近使用了接受的答案,我想与大家分享一下我的经验.虽然它确实提供了正确的标记,但它给我带来了问题,特别是当我尝试使用任何下拉列表提交表单时,我会得到可怕的"无效的回发或回调参数"错误.在谷歌搜索疯狂之后,我看到了这篇文章,然后链接到这篇博文.我最终使用的代码是这样的:

    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");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这里使用的列表项是在设计页面而不是代码隐藏页面中创建的,如下所示:

<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>
Run Code Online (Sandbox Code Playgroud)

这产生了与此处接受的答案相同的标记,但这并没有给我回发错误.我希望这可以为某人带来一些悲伤.