65.9K
CodeProject 正在变化。 阅读更多。
Home

支持选项组的 ASP.NET DropDownList

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.81/5 (36投票s)

2006年9月7日

1分钟阅读

viewsIcon

499308

downloadIcon

8704

一个 DropDownList 控件适配器的实现,它提供了选项组的支持。

引言

ASP.NET 2.0 尽管拥有各种强大的功能,但由于原因不明,仍然缺少一些功能。其中一个值得注意的缺失就是在 DropDownList 控件中缺少选项组 (<optgroup>) 支持。对于不熟悉 <optgroup> 元素的人来说,它是 XHTML 标准的一部分,其效果是在 <select> 中对项目进行分类,如图所示。

Option Groups

当我开始寻找在 ASP.NET 中实现此功能的解决方案时,我发现很少有文章提供任何可行的解决方案。另一位 CodeProject 成员提出了一种简洁的解决方案,但看起来代码量很大,而且我确信有更简单的方法。在阅读了一些评论后,我意识到控件适配器是正确的选择。控件适配器是 ASP.NET 2.0 中的新功能,允许开发人员覆盖任何控件的呈现行为,非常强大!此外,控件适配器与浏览器文件结合使用,因此可以针对特定的浏览器,如果需要的话。掌握了这些知识,解决方案就变得很简单了。随附的下载包含在您自己的项目中实现此解决方案所需的的文件,但为了便于以后参考,我也会在这里粘贴它。

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();
    }
}
© . All rights reserved.