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
}
}
此源码由周庆东编写,转载请表明出处。