[原创] C# 服务器控件 分组下拉框
using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.IO; using System.Text; using System.Text.RegularExpressions; using System.Web.UI; using System.Web.UI.WebControls; [assembly: TagPrefix("ZControlLibrary", "zAsp")] namespace ZControlLibrary { /// <summary> /// 分组下拉列表 /// </summary> [ToolboxData("<{0}:GroupDropDownList runat=server></{0}:GroupDropDownList>")] public class GroupDropDownList : DropDownList { #region 绑定数据前的用户自定义下拉项 /// <summary> /// 绑定数据前的用户自定义下拉项 /// </summary> public Dictionary<string, string> beforeItems { get { Dictionary<string, string> bs = (Dictionary<string, string>)ViewState["beforeItems"] ?? new Dictionary<string, string>(); return bs; } set { ViewState["beforeItems"] = value; } } #endregion #region 已分组下拉项 /// <summary> /// 已分组下拉项 /// </summary> private Dictionary<string, string> groupItems { get { Dictionary<string, string> gs = (Dictionary<string, string>)ViewState["groupItems"] ?? new Dictionary<string, string>(); return gs; } set { ViewState["groupItems"] = value; } } #endregion #region 获取或设置为各列表项提供分组的数据源字段 private string dataGroupField; /// <summary> /// 获取或设置为各列表项提供分组的数据源字段 /// </summary> public string DataGroupField { get { return dataGroupField; } set { dataGroupField = value; } } #endregion #region 获取列表控件中选定项的分组名称 /// <summary> /// 获取列表控件中选定项的分组名称 /// </summary> public string SelectedGroupName { get { if (!string.IsNullOrEmpty(base.Text)) { foreach (string key in groupItems.Keys) { string[] values = groupItems[key].Split(','); foreach (string value in values) { if (value == base.Text) { if (key.Equals("未知分组")) { return string.Empty; } return key; } } } } return string.Empty; } } #endregion public GroupDropDownList() { } #region 将数据源绑定到被调用的服务器控件及其所有子控件 /// <summary> /// 将数据源绑定到被调用的服务器控件及其所有子控件 /// </summary> public override void DataBind() { Dictionary<string, string> _beforeItems = new Dictionary<string, string>(); if (base.AppendDataBoundItems) { foreach (ListItem li in base.Items) { li.Selected = false; _beforeItems.Add(li.Value, li.Text); } } this.beforeItems = _beforeItems; Grouping(); base.DataBind(); } #endregion #region 对绑定数据进行分组 /// <summary> /// 对绑定数据进行分组 /// </summary> private void Grouping() { DataView dvDataSource = new DataView(); if (base.DataSource is DataTable) { dvDataSource.Table = (DataTable)base.DataSource; } else if (base.DataSource is DataView) { dvDataSource = (DataView)base.DataSource; } StringBuilder sb = new StringBuilder(); Dictionary<string, string> _groupItems = new Dictionary<string, string>(); foreach (string value in beforeItems.Keys) { string key = string.Empty; if (!_groupItems.ContainsKey(key)) { sb.Append(value); _groupItems.Add(key, sb.ToString()); } else { sb.Append("," + value); _groupItems[key] = sb.ToString(); } } if (dvDataSource.Count > 0 && !string.IsNullOrEmpty(this.DataGroupField)) { dvDataSource.Sort = string.Format("{0},{1} asc", this.DataGroupField, base.DataTextField ?? base.DataValueField); foreach (DataRowView drv in dvDataSource) { string key = Convert.ToString(drv[this.DataGroupField]); key = string.IsNullOrEmpty(key) ? "未知分组" : key; object value = drv[base.DataValueField] ?? drv[base.DataTextField]; if (!_groupItems.ContainsKey(key)) { sb = new StringBuilder(); sb.Append(Convert.ToString(value)); _groupItems.Add(key, sb.ToString()); } else { sb.Append("," + value); _groupItems[key] = sb.ToString(); } } } this.groupItems = _groupItems; } #endregion #region 获取分组后下拉选项的内容 /// <summary> /// 获取分组后下拉选项的内容 /// </summary> /// <returns></returns> protected string GetGroupOptions() { if (groupItems == null || groupItems.Count == 0 || (groupItems.Count == 1 && groupItems.ContainsKey(""))) { return string.Empty; } StringBuilder sb = new StringBuilder(); foreach (string key in groupItems.Keys) { string[] values = groupItems[key].Split(','); if (!string.IsNullOrEmpty(key)) { sb.Append("<optgroup label=\"" + key + "\">"); } foreach (string value in values) { foreach (ListItem li in base.Items) { if (li.Value == value) { sb.Append(GetOption(li.Text, li.Value)); break; } } } if (!string.IsNullOrEmpty(key)) { sb.Append("</optgroup>"); } } return sb.ToString(); } /// <summary> /// 获取选项内容 /// </summary> private string GetOption(string text, string value) { return string.Format("<option value=\"{0}\"{2}>{1}</option>", value, text, value == base.Text ? " selected=\"selected\"" : string.Empty); } #endregion #region 重组控件内容 protected override void Render(HtmlTextWriter writer) { string options = GetGroupOptions(); if (!string.IsNullOrEmpty(options)) { StringWriter html = new StringWriter(); HtmlTextWriter tw = new HtmlTextWriter(html); base.Render(tw); string outhtml = html.ToString(); outhtml = Regex.Replace(outhtml, "\\s+", " "); outhtml = Regex.Replace(outhtml, ">\\s+<", "><"); outhtml = outhtml.Trim(); int startIndex = outhtml.IndexOf('>') + 1; outhtml = outhtml.Remove(startIndex, outhtml.LastIndexOf("</") - startIndex); outhtml = outhtml.Insert(startIndex, options); writer.Write(outhtml); } else { base.Render(writer); } } #endregion } }
此源码由周庆东编写,转载请表明出处。