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
}
}