联动下拉框显示省市县镇

首先,这次用到的知识点有三层的逻辑还有连接数据库知识以及传参知识点,废话不多说,首先展示页面:

首先第一本机的数据库,连接字符创写在app.cofing里,这个不用多说了:

<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
  <connectionStrings>
    <add name="constr" connectionString="Data Source=.;Initial Catalog=LiuHui;uid=sa;password=sybase;"/>
  </connectionStrings>
</configuration>

然后是页面布局,上面也看到了,这里我用十个下拉框是因为后面传值需要用到,以现在的知识实在想不出什么高招了,只能用笨办法了,

接着我们写dal层代码,public static string ConStr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;这一句应该是取我们app.cofing里的连接字符串

 public DataTable SelectSanLinkane(string SanLinkane)
        {
            string str = "Data Source =.;initial catalog=LiuHui;uid=sa;password=sybase";
            SqlConnection con = new SqlConnection(str);
            string sql = "select * from SanLiname";
            SqlDataAdapter da = new SqlDataAdapter(sql, con);
            DataSet ds = new DataSet();
            try
            {
                da.Fill(ds, "SanLiname");
            }
            catch (Exception ex)
            {


                throw new Exception(ex.Message);
            }
            return ds.Tables["SanLiname"];
        }

这个方法是把数据库中的数据加载到内存表中,这样的好处就是数据库断开连接的时候照样不影响客户端的操作。

public List<SanLinameClass> ComBox()
        {
            List<SanLinameClass> list = new List<SanLinameClass>();
            using (SqlConnection con = new SqlConnection(ConStr))
            {
                try
                {
                    string sql = "select * from SanLiname where ParentID = 0";
                    SqlCommand cmd = new SqlCommand(sql, con);
                    con.Open();
                    SqlDataReader dr = cmd.ExecuteReader();
                    while (dr.Read())
                    {
                        SanLinameClass SL = new SanLinameClass();
                        SL.ID = Convert.ToInt32(dr["ID"]);
                        SL.Name = dr["Name"].ToString();
                        list.Add(SL);
                    }
                }
                catch (Exception ex)
                {


                    throw new Exception(ex.Message);
                }
            }
            return list;
        }

这个方法就是过滤我们取到的值,然后得到我们想要的值,这里我们只要中国的根节点

public List<SanLinameClass> ComBox1(string s)
        {
            List<SanLinameClass> list1 = new List<SanLinameClass>();
            using (SqlConnection con = new SqlConnection(ConStr))
            {
                try
                {
                    string sql = "select * from SanLiname where ParentID = ";
                    string sql1 = sql + s;
                    SqlCommand cmd = new SqlCommand(sql1, con);
                    con.Open();
                    SqlDataReader dr = cmd.ExecuteReader(); ;
                    while (dr.Read())
                    {
                        SanLinameClass sl = new SanLinameClass();
                        sl.ID = Convert.ToInt32(dr["ID"]);
                        sl.Name = dr["Name"].ToString();
                        list1.Add(sl);
                    }
                }
                catch (Exception ex)
                {


                    throw new Exception(ex.Message);
                }
            }
            return list1;
        }

这个和上面一样,不同之处是多了一个参数,这个参数用于传值用,这里要注意的是 List<SanLinameClass> list1 = new List<SanLinameClass>();必须放在方法里面,这是我做的时候遇到的一些问题,如果不放在方法里面,我们的combox每运行一次,就重新添加一遍数据。然后你想做几层就写几个方法,你也可以进行封装。

接着是我们的BLL层;

 SanLinkameDal SLDal = new SanLinkameDal();
        //0是国家、1是省份、2是市区、3是县、4是乡镇。
        public DataTable selectSanLinkane(string SanLinkane)
        {
            return SLDal.SelectSanLinkane(SanLinkane);
        }
        public List<SanLinameClass> ComBox()
        { //国家
            return SLDal.ComBox();
        }
        public List<SanLinameClass> ComBox1(string s)
        {//省份
            return SLDal.ComBox1(s);
        }
        public List<SanLinameClass> ComBox2(string ss)
        {//市区
            return SLDal.ComBox2(ss);
        }
        public List<SanLinameClass> ComBox3(string sss)
        {//县
            return SLDal.ComBox3(sss);
        }
        public List<SanLinameClass> ComBox4(string ssss)
        { //乡镇
            return SLDal.ComBox4(ssss);
        }


这是BLL层的所有代码,

再然后是UI层代码,我用的事件驱动是comboxclick事件,也就是单击事件,首先根节点的数据读取是加载页面的时候就开始加载数据

 private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                List<SanLinameClass> list = SLda.ComBox();
                list.Insert(0, new SanLinameClass() { ID = -1, Name = "--全部--" });
                comboBox1.DataSource = list;
                comboBox6.DataSource = list;
                comboBox1.ValueMember = "ID";
                comboBox1.DisplayMember = "Name";
                comboBox6.ValueMember = "ID";
                chuanzhi = Convert.ToString(comboBox1.SelectedIndex + 1);
                label6.Text = chuanzhi;
            }
            catch (Exception ex)
            {


                MessageBox.Show(ex.Message);
            }


        }

其中 comboBox1.DataSource = list;是把数据源添加到控件中,然后 comboBox1.ValueMember = "ID";是获取相应Name的ID值,这是关键,因为我们需要ID值来对数据进行查询           comboBox1.DisplayMember = "Name";获取Name值,这里我是使用了两个combox控件,然后chuanzhi = Convert.ToString(comboBox1.SelectedIndex + 1);这是为了对应数据库中ID的值

public void ComBox1()
        {
            if (comboBox6.Text != "")
            {
                chuanzhi = comboBox6.Text;
                List<SanLinameClass> list2 = SLda.ComBox2(chuanzhi);
                comboBox2.DataSource = list2;
                comboBox7.DataSource = list2;
                comboBox2.ValueMember = "ID";
                comboBox2.DisplayMember = "Name";
                comboBox7.ValueMember = "ID";
                chuanzhi = Convert.ToString(comboBox2.SelectedIndex + 3);
            }
        }

定义了一个方法,这是第一个combox的点击事件要执行的方法,逻辑就是点击第一个combox,第二个combox获取数据,这样达到联动效果 。其中chuanzhi = Convert.ToString(comboBox2.SelectedIndex + 3);为什么加3,是因为我的数据库数据的原因。


好了,这次的联动下拉框的代码和思路就是这样差不多了。


如果有感兴趣的小伙伴也想做一个,但是又碰到难题,欢迎随时交流,QQ:511582456



感悟:强者的道路也是由这微小的知识铺就的,不放弃每一份汗水,只有坚持,才能走出自己的道路,我在路上