自动生成联动下拉框控件
来源:互联网 发布:mac系统mp3剪接 编辑:程序博客网 时间:2024/05/16 10:42
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
namespace SMAS.Common.Controls
{
public class CascadingDDL : WebControl, INamingContainer
{
private string[] selectedtextAtlevel;
private string[] selectedvalueAtlevel;
private string selectsql;
private SqlCommand cmd;
private static SqlConnection conn;
private string selecteditem;
private Panel ddlpanel;
private DropDownList ddl;
SqlGetDataSet dataset = new SqlGetDataSet();
private Style panelstyle;
private Style ddlstyle;
#region 样式属性
/// <summary>
/// 定义Panel的样式,应用于整个控件的背景和框架设置
/// 当下拉框和Panel的宽度相等时,这个控件下拉框成竖立显示
/// </summary>
[
Category("Styles"),
DefaultValue(null),
DesignerSerializationVisibility(
DesignerSerializationVisibility.Content),
PersistenceMode(PersistenceMode.InnerProperty),
Description(
"应用于整个控件背景和框架的样式")
]
public virtual Style PanelStyle
{
get
{
if (panelstyle == null)
{
panelstyle = new Style();
if (IsTrackingViewState)
{
((IStateManager)panelstyle).TrackViewState();
}
}
return panelstyle;
}
}
/// <summary>
/// 定义下拉框的样式
/// 当下拉框和Panel的宽度相等时,这个控件下拉框成竖立显示
/// </summary>
[
Category("Styles"),
DefaultValue(null),
DesignerSerializationVisibility(
DesignerSerializationVisibility.Content),
PersistenceMode(PersistenceMode.InnerProperty),
Description(
"应用于下拉框的样式")
]
public virtual Style DDLStyle
{
get
{
if (ddlstyle == null)
{
ddlstyle = new Style();
if (IsTrackingViewState)
{
((IStateManager)ddlstyle).TrackViewState();
}
}
return ddlstyle;
}
}
#endregion
#region 自定义视图状态
protected override void LoadViewState(object savedState)
{
if (savedState == null)
{
base.LoadViewState(null);
return;
}
else
{
Triplet t = savedState as Triplet;
if (t != null)
{
base.LoadViewState(t.First);
if ((t.Second) != null)
{
((IStateManager)PanelStyle).LoadViewState(t.Second);
}
if ((t.Third) != null)
{
((IStateManager)DDLStyle).LoadViewState(t.Third);
}
}
else
{
throw new ArgumentException("Invalid view state .");
}
}
}
protected override object SaveViewState()
{
object baseState = base.SaveViewState();
object panelStyleState = null;
object ddlStyleState = null;
if (panelstyle != null)
{
panelStyleState =
((IStateManager)panelstyle).SaveViewState();
}
if (ddlstyle != null)
{
ddlStyleState =
((IStateManager)ddlstyle).SaveViewState();
}
return new Triplet(baseState,
panelStyleState, ddlStyleState);
}
protected override void TrackViewState()
{
base.TrackViewState();
if (panelstyle != null)
{
((IStateManager)panelstyle).TrackViewState();
}
if (ddlstyle != null)
{
((IStateManager)ddlstyle).TrackViewState();
}
}
#endregion
#region 属性
/// <summary>
/// 默认选择项的Value值,按下拉框顺序依次以逗号隔开,如果默认选择项不足总下拉框个数请用逗号补上
/// </summary>
[Bindable(true),
Category("Defalut"),
DefaultValue(""),
Description("默认选择项的Value值,按下拉框顺序依次以逗号隔开")
]
public string SelectedItem
{
get
{
return (string)ViewState["selecteditem"];
}
set
{
ViewState["selecteditem"] = value;
}
}
/// <summary>
/// SqlCommand数据库查询对象
/// </summary>
[Bindable(true),
Category("Data"),
DefaultValue(""),
Description("SqlCommand数据库查询对象")]
public SqlCommand SqlCommand
{
get
{
return cmd;
}
set
{
cmd = value;
}
}
/// <summary>
/// 要生成下拉框列绑定的关键字,中间用逗号隔开, 如国家_省_地区三级(country,province,city)同时请注意数据库的字段设计,因为是动态构成SQL语句,所以在查询中要绑定的Text 和 Value分别以“_name”和“_value”结尾构成。所以如国家,省,市三级数据库相对字段请设为country_name,country_value,province_name,province_value,city_name,city_value)。 即Category="country,province,city" 则 sql="select country_name,country_value,province_name,province_value,city_name,city_value from area "
/// </summary>
[Bindable(true),
Category("Default"),
DefaultValue(""),
Description("要生成下拉框列绑定的关键字,中间用逗号隔开, 如国家_省_地区三级(country,province,city)")]
public string Category
{
get { return (string)ViewState["category"]; }
set { ViewState["category"] = value; }
}
/// <summary>
/// 输出参数,返回生成下拉框的总个数
/// </summary>
[Bindable(true),
Category("Default"),
DefaultValue(""),
Description("输出参数,返回生成下拉框的总个数")]
public int TotalNumOfLevel
{
get
{
return (int)ViewState["count"];
}
}
/// <summary>
/// 输出参数,返回下拉框的Text值数组
/// </summary>
[Bindable(true),
Category("Default"),
DefaultValue(""),
Description("输出参数,返回下拉框的Text值数组")]
public string[] SelectedTextAtLevel
{
get { return (string[])ViewState["text"]; }
}
/// <summary>
/// 输出参数,返回下拉框的Value值数组
/// </summary>
[Bindable(true),
Category("Default"),
DefaultValue(""),
Description("输出参数,返回下拉框的Value值数组")]
public string[] SelectedValueAtLevel
{
get { return (string[])ViewState["value"]; }
}
#endregion
#region 方法
/// <summary>
/// 用于创建下拉框对象和设置默认选择项
/// </summary>
protected override void CreateChildControls()
{
Controls.Clear();
ddlpanel = new Panel();
#region 拆分传进来的SqlCommand对象成Sql和SqlConnection
string[] Hierachy = ViewState["category"].ToString().Split(',');
if (!Page.IsPostBack)
{
ViewState["selectsql"] = cmd.CommandText.ToString();
conn = cmd.Connection;
}
#endregion
if (panelstyle != null)
{
ddlpanel.ApplyStyle(panelstyle);
}
int Count = Hierachy.Length;
// ddlpanel.CssClass = "panelCssClass";
for (int i = 0; i < Count; i++)
{
ddl = new DropDownList();
if (ddlstyle != null)
{
ddl.ApplyStyle(ddlstyle);
}
ddl.ID = this.ID + "ddl" + i.ToString();
//ddl.CssClass = "ddlCssClass";
ddl.AutoPostBack = true;
selectsql = ViewState["selectsql"].ToString();
ddl.SelectedIndexChanged += new EventHandler(ddl_SelectedIndexChanged);
if (i == 0)
{
string name = Hierachy[0] + "_name";
string value = Hierachy[0] + "_value";
string sql = "select distinct " + name + "," + value + " from ( " + selectsql + " ) as T ";
ddl.DataSource = dataset.GetDataSet(sql, conn);
ddl.DataTextField = name;
ddl.DataValueField = value;
ddl.DataBind();
ddl.Items.Insert(0, new ListItem("请选择", "0"));
}
this.ddlpanel.Controls.Add(ddl);
}
this.Controls.Add(ddlpanel);
#region 当不是回发事件并有设置默认选项时绑定默认项
if (!Page.IsPostBack)
{
if (ViewState["selecteditem"] != null && ViewState["selecteditem"].ToString() != "")
{
selecteditem = ViewState["selecteditem"].ToString();
string[] Select = selecteditem.Split(',');
for (int j = 0; j < Count; j++)
{
string selectddl = this.ID + "ddl" + j.ToString();
DropDownList ddl_selent = (DropDownList)this.ddlpanel.FindControl(selectddl);
if (j == 0)
{
ddl_selent.SelectedValue = Select[j];
}
else
{
string name2 = Hierachy[j] + "_name";
string value2 = Hierachy[j] + "_value";
string Pvalue2 = Hierachy[j - 1] + "_value";
string sql = "select distinct " + name2 + "," + value2 + " from ( " + selectsql + " ) as T where " + Pvalue2 + "=N'" + Select[j - 1] + "'";
ddl_selent.DataSource = dataset.GetDataSet(sql, conn);
ddl_selent.DataTextField = name2;
ddl_selent.DataValueField = value2;
ddl_selent.DataBind();
ddl_selent.SelectedValue = Select[j];
}
}
}
}
#endregion
Arrlist();
}
#endregion
#region 响应下拉框Changed事件
/// <summary>
/// 响应下拉框的Change事件,并绑定下个下拉框
/// </summary>
/// <param name="sender">事件的发送者</param>
/// <param name="e">包含事件数据的类的基类</param>
protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
{
DropDownList dr = (DropDownList)sender;
string[] countlist = ViewState["category"].ToString().Split(',');
string id = dr.ID;
int num = int.Parse(id.Substring(id.Length - 1, 1));
string select = dr.SelectedValue.ToString();
if (num != countlist.Length - 1)
{
string ID = this.ID + "ddl" + (num + 1).ToString();
DropDownList ddl = (DropDownList)this.ddlpanel.FindControl(ID);
ddl.Enabled = true;
string name = countlist[num + 1] + "_name";
string value = countlist[num + 1] + "_value";
string Pvalue = countlist[num] + "_value";
string sql = "select distinct " + name + "," + value + " from ( " + selectsql + " ) as T where " + Pvalue + "=N'" + select + "'";
DataSet ds = dataset.GetDataSet(sql, conn);
int i = ds.Tables[0].Rows.Count;
if (num == 0 || i == 0)
{
ddl.Items.Clear();
ddl.Enabled = false;
}
if (i.ToString() != "0")
{
if (ds.Tables[0].Rows[0][name].ToString() != "" && ds.Tables[0].Rows[0][name] != null)
{
ddl.DataSource = dataset.GetDataSet(sql, conn);
ddl.DataTextField = name;
ddl.DataValueField = value;
ddl.DataBind();
ddl.Items.Insert(0, new ListItem("请选择", "0"));
ddl.Enabled = true;
}
else
{
ddl.Enabled = false;
}
}
for (int j = num + 2; j < countlist.Length; j++)
{
string LID = this.ID + "ddl" + j.ToString();
DropDownList Lddl = (DropDownList)this.ddlpanel.FindControl(LID);
if (Lddl != null)
{
Lddl.Items.Clear();
Lddl.Enabled = false;
}
}
}
}
#endregion
#region 绑定返回Text、Value数组和生成下拉框总个数
/// <summary>
/// 取回当前所有选择项的Text和Value值,并返回对象数组
/// 返回对象:TotalNumOfLevel(总下拉框数)
/// SelectedTextAtLevel(当前所有选项的Text值数组)
/// SelectedValueAtLevel(当前所有选项的Valut值数组)
/// </summary>
public void Arrlist()
{
string[] countlist = ViewState["category"].ToString().Split(',');
int count = countlist.Length;
ViewState["count"] = count;
selectedvalueAtlevel = new string[count];
selectedtextAtlevel = new string[count];
for (int i = 0; i < count; i++)
{
string drp = this.ID + "ddl" + i.ToString();
DropDownList dr = (DropDownList)this.ddlpanel.FindControl(drp);
if (dr != null && dr.SelectedItem != null)
{
selectedtextAtlevel[i] = dr.SelectedItem.ToString();
selectedvalueAtlevel[i] = dr.SelectedValue.ToString();
}
else
{
selectedtextAtlevel[i] = "";
selectedvalueAtlevel[i] = "";
}
}
ViewState["text"] = selectedtextAtlevel;
ViewState["value"] = selectedvalueAtlevel;
}
#endregion
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace SMAS.Common.Controls
{
/// <summary>
/// 用于数据库查询
/// </summary>
public class SqlGetDataSet
{
public SqlGetDataSet()
{ }
#region 数据库查询,返回DateSet
/// <summary>
/// 数据库查询,返回DataSet对象
/// </summary>
/// <param name="sql">动态生成的Sql语句</param>
/// <param name="conn">SqlConnection对象</param>
/// <returns></returns>
public DataSet GetDataSet(string sql, SqlConnection conn)
{
conn.Open();
SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
DataSet ds = new DataSet();
sda.Fill(ds);
conn.Close();
return ds;
}
#endregion
}
}
- 自动生成联动下拉框控件
- 多级联动下拉框控件实现
- 可编辑可自动匹配的联动下拉框实现
- altas(ajax)控件(六):CascadingDropDown 联动选择的下拉框
- altas(ajax)控件(六):CascadingDropDown 联动选择的下拉框
- ASP利用数据表生成多级联动下拉列表框
- 移动端html5 自动生成下拉刷新控件
- 下拉框三级联动
- 下拉框联动
- JS联动下拉框
- 三级联动下拉框
- 下拉框二级联动
- 下拉框联动
- 下拉框联动
- 下拉框联动
- JS联动下拉框
- ext下拉框联动
- ext下拉框联动
- ERP DB from AIX(32位)迁往Linux(64位),并且将DB由8173升级到9208
- .net 大文件上传设定
- 外企喜欢用什么样的人?
- Mediator Pattern(GoF-Behavioral Design Patterns)
- Rational ClearQuest介绍功能简介:
- 自动生成联动下拉框控件
- 中介者模式(Mediator)
- 初探blazeDS
- enterpriseliberary2005运行时报错
- 什么是Java事务
- override和重载的区别?
- 一个老职业人的心里话---华宏伟上海财大演讲语录
- C# 分页类
- 项目人生,成长与感悟