重写 DropDownList 添加optgroup
### 重写 DropDownList 添加 optgroup 及样式设置 在 Web 开发中,`DropDownList` 控件是非常常用的一个选择控件,它可以帮助用户快速地从一个下拉列表中选择一个选项。然而,默认情况下,`.NET` 的 `DropDownList` 并不支持 `optgroup` 功能(即分组选项),也不提供方便的方式来对 `ListItem` 设置样式。 #### 1. 什么是 optgroup? `optgroup` 是 HTML 中用于将多个相关的 `option` 元素组合在一起的元素。这对于提高用户体验非常有用,因为它可以让用户更清晰地看到选项之间的逻辑关系。 #### 2. 为什么需要重写 DropDownList? 由于默认的 `DropDownList` 不支持 `optgroup` 和方便的样式设置功能,因此我们需要通过继承 `DropDownList` 类并覆盖其 `RenderContents` 方法来实现这一功能。 #### 3. 实现步骤 ##### 3.1 创建自定义的 DropDownList 类 ```csharp public class NewDropDownList : DropDownList { // 重写 RenderContents 方法 protected override void RenderContents(HtmlTextWriter writer) { string optgroup; ArrayList optOptionGroups = new ArrayList(); foreach (ListItem item in this.Items) { if (item.Attributes["optgroup"] == null) { RenderListItem(item, writer); } else { optgroup = item.Attributes["optgroup"]; if (optOptionGroups.Contains(optgroup)) { RenderListItem(item, writer); } else { if (optOptionGroups.Count > 0) { optgroupEndTag(writer); } optgroupBeginTag(optgroup, writer); optOptionGroups.Add(optgroup); } } } if (optOptionGroups.Count > 0) { optgroupEndTag(writer); } } // 渲染 ListItem private void RenderListItem(ListItem item, HtmlTextWriter writer) { writer.WriteBeginTag("option"); writer.WriteAttribute("value", item.Value, true); writer.WriteAttribute("style", "color:#7395c1", 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(); } // 开始 optgroup 标签 private void optgroupBeginTag(string name, HtmlTextWriter writer) { writer.WriteBeginTag("optgroup"); writer.WriteAttribute("label", name); writer.Write(HtmlTextWriter.TagRightChar); writer.WriteLine(); } // 结束 optgroup 标签 private void optgroupEndTag(HtmlTextWriter writer) { writer.WriteEndTag("optgroup"); writer.WriteLine(); } // 构造函数 public NewDropDownList() { // 初始化 ListItem ListItem li1 = new ListItem(); li1.Attributes.Add("optgroup", li1.Text); Items.Add(li1); ListItem li2 = new ListItem(); Items.Add(li2); ListItem li3 = new ListItem(); Items.Add(li3); } } ``` #### 4. 使用自定义的 NewDropDownList 使用上面创建的 `NewDropDownList` 非常简单,只需要像普通 `DropDownList` 一样添加到页面即可: ```aspx <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TestWebApp.Default" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:NewDropDownList ID="NewDropDownList1" runat="server"></asp:NewDropDownList> </div> </form> </body> </html> ``` #### 5. 结论 通过上述方法,我们可以轻松地扩展 `DropDownList` 的功能,支持 `optgroup` 以及对 `ListItem` 进行样式设置。这不仅提高了开发效率,还增强了用户体验。此外,这种方法还可以进一步扩展,比如增加更多的样式设置选项、支持动态添加或删除 `optgroup` 等,从而更好地满足不同的应用场景需求。
optgroup 效果很酷,对于小型的二级或者多级下拉菜单如果不想做成连动那么复杂用optgroup 是个不错的办法.
但是, .net DropDownList 并不支持optgroup.同时想自定义ListItem 的样式似乎想一步也做到也不容易.
可以通过重写dropdownlist 一些方法,定义新的dropdownlist类来简单的实现.
public class NewDropDownList:DropDownList
{
//重写方法
protected override void RenderContents(HtmlTextWriter writer)
{
string optgroup;
ArrayList optOptionGroups = new ArrayList();
foreach(ListItem item in this.Items)
{
if(item.Attributes["optgroup"] == null)
{
RenderListItem(item, writer);
}
else
{
optgroup = item.Attributes["optgroup"];
if(optOptionGroups.Contains(optgroup))
{
RenderListItem(item, writer);
}
- techbmy32013-03-01可以使用,已用于我的程序
- kbrave2013-03-19从网上抄的,代码根本不能用!!
- 粉丝: 4
- 资源: 34
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助