Windows VistaWindows 2003Visual Studio 2005Windows 2000Windows XP.NET 2.0C# 2.0中级开发Visual StudioWindows.NETASP.NETC#
支持选项组的 ASP.NET DropDownList






4.81/5 (36投票s)
2006年9月7日
1分钟阅读

499308

8704
一个 DropDownList 控件适配器的实现,它提供了选项组的支持。
引言
ASP.NET 2.0 尽管拥有各种强大的功能,但由于原因不明,仍然缺少一些功能。其中一个值得注意的缺失就是在 DropDownList
控件中缺少选项组 (<optgroup>
) 支持。对于不熟悉 <optgroup>
元素的人来说,它是 XHTML 标准的一部分,其效果是在 <select>
中对项目进行分类,如图所示。
当我开始寻找在 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();
}
}