序言
ASP.NET 2.0虽然很有特色,不足的是有一些奇特的功能全然不知。像这一样一个显著的疏忽,下拉控件不支持OptionGroup(<optgroup>) ,<optgroup> 元素也是XHTML的一部分,各式各样的分类选项列在<select>标签里。像下列图所显示:
当我第一次去寻找并解决这个控件问题时,网上关于这类文章的不。发现一个CodeProject 的成员提供了一个很好的方案。看上去得用很多代码才能实现,不过我相信能应该有更好的方法实现。我看了一些评论,这明显是使用Control Adapter(控件适配器)来完成。Control Adapter是ASP.NET2.0里的一个新概念,它允许开发者通过重写rendering 行为去实现任何控件,多好的东西!此外,Control Adapter还与浏览器文件关联使用。掌握好这些的知识,解决这个问题就变得简单了。以后如果有更好的方法,我将在这与大家分享。
代码如下:
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();
}
}
lotuspro
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();
}
}
lotuspro
原文:http://www.codeproject.com/aspnet/DropDownListOptionGroup.asp