自動生成聯動下拉框控件

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章