自动生成联动下拉框控件

来源:互联网 发布: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
    }
}