none
combobox问题(2) RRS feed

  • 问题

  • 问题是不加   comboBox1_SelectedIndexChanged事件,combobox2显示的是正确的,但一加上此事件,combobox2显示的就是重复的几条数据,不知为什么,怎么改?谢谢

            private void xianlujiegou_Load(object sender, EventArgs e)
            {
                ////////向combobox中添加数据库表中的列/////////////
                string selectCmd, selectCmd1;
                selectCmd = "Select distinct 公司 From 馈线";
                conn = new SqlConnection(connStr);
                myAdapter = new SqlDataAdapter(selectCmd, conn);
                myAdapter.Fill(myDataSet, "公司");
                if (myDataSet.Tables["公司"].Rows.Count > 0)
                {
                    for (int j = 0; j < myDataSet.Tables["公司"].Rows.Count; j++)
                    {
                        if (myDataSet.Tables["公司"].Rows[j][0].ToString().Trim() != "")
                        {
                            comboBox1.Items.Add(myDataSet.Tables["公司"].Rows[j][0].ToString().Trim());
                        }
                    }
                    comboBox1.SelectedIndex = 0;
                }
                ////////根据公司选择变电站//////////
                selectCmd1 = "Select distinct  变电站 From 馈线 where 公司='" + comboBox1.Text.Trim() + "'";
                myAdapter = new SqlDataAdapter(selectCmd1, conn);
                myAdapter.Fill(myDataSet, "变电所");
                if (myDataSet.Tables["变电所"].Rows.Count > 0)
                {

                    for (int j = 0; j < myDataSet.Tables["变电所"].Rows.Count; j++)
                    {
                        if (myDataSet.Tables["变电所"].Rows[j][0].ToString().Trim() != "")
                        {
                            comboBox2.Items.Add(myDataSet.Tables["变电所"].Rows[j][0].ToString().Trim());
                        }
                    }
                    comboBox2.SelectedIndex = 0;
                }
                selectCmd1 = "Select distinct  馈线名称 From 馈线 where 公司='" + comboBox1.Text.Trim() + "'and 变电站='" + comboBox2.Text.Trim() + "'";
                myAdapter = new SqlDataAdapter(selectCmd1, conn);
                myAdapter.Fill(myDataSet, "馈线名称");
                if (myDataSet.Tables["馈线名称"].Rows.Count > 0)
                {

                    for (int j = 0; j < myDataSet.Tables["馈线名称"].Rows.Count; j++)
                    {
                        if (myDataSet.Tables["馈线名称"].Rows[j][0].ToString().Trim() != "")
                        {
                            comboBox3.Items.Add(myDataSet.Tables["馈线名称"].Rows[j][0].ToString().Trim());
                        }
                    }
                    comboBox3.SelectedIndex = 0;
                }

            }

            private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
            {
                comboBox2.Text = "";
                comboBox2.Items.Clear();
                comboBox3.Text = "";
                comboBox3.Items.Clear();
                string selectCmd1 = "Select distinct  变电站 From 馈线 where 供电公司='" + comboBox1.Text.Trim() + "'";
                 myAdapter = new SqlDataAdapter(selectCmd1, conn);
                myAdapter.Fill(myDataSet1, "变电所");
                if (myDataSet1.Tables["变电所"].Rows.Count > 0)
                {

                    for (int j = 0; j < myDataSet1.Tables["变电所"].Rows.Count; j++)
                    {
                        if (myDataSet1.Tables["变电所"].Rows[j][0].ToString().Trim() != "")
                        {
                            comboBox2.Items.Add(myDataSet1.Tables["变电所"].Rows[j][0].ToString().Trim());
                        }
                    }
                    comboBox2.SelectedIndex = 0;
                }
            }

    2009年8月12日 9:28

答案

  • 很明显你在创建第一个 Combobox 触发了 SelectIndexChanged 事件,这时已在 Combobox2 中创建 了一部分数据,你后面又对 Combobox2 创建了其它项,当然有可能重了
    要么在创建第二个 Combobox 前执行 comboBox2.Items.Clear(); 要么把  comboBox1.SelectedIndex = 0; 放到 Form_Load 的最后面


             另外你的实现方式也不是最好的,
    1. 所有相关数据可以一次性读取出来,
    2. 使用 BindingSource 对 Combobox 进行绑定
    3. SqlDataAdapter 使用了要显示释放,最好用 using




    知识改变命运,奋斗成就人生!
    • 已标记为答案 yanbing 2009年8月12日 10:19
    2009年8月12日 10:01
    版主
  • private void xianlujiegou_Load(object sender, EventArgs e)
            {
                ////////向combobox中添加数据库表中的列/////////////
                string selectCmd, selectCmd1;
                selectCmd = "Select distinct 公司 From 馈线";
                conn = new SqlConnection(connStr);
                myAdapter = new SqlDataAdapter(selectCmd, conn);
                myAdapter.Fill(myDataSet, "公司");
                if (myDataSet.Tables["公司"].Rows.Count > 0)
                {
                    for (int j = 0; j < myDataSet.Tables["公司"].Rows.Count; j++)
                    {
                        if (myDataSet.Tables["公司"].Rows[j][0].ToString().Trim() != "")
                        {
                            comboBox1.Items.Add(myDataSet.Tables["公司"].Rows[j][0].ToString().Trim());
                        }
                    }
                    comboBox1.SelectedIndex = 0;
                }
                ////////根据公司选择变电站//////////
    
                // 这里注意
                comboBox2.Text = "";
                comboBox2.Items.Clear();
    
    
                selectCmd1 = "Select distinct  变电站 From 馈线 where 公司='" + comboBox1.Text.Trim() + "'";
                myAdapter = new SqlDataAdapter(selectCmd1, conn);
                myAdapter.Fill(myDataSet, "变电所");
                if (myDataSet.Tables["变电所"].Rows.Count > 0)
                {
    
                    for (int j = 0; j < myDataSet.Tables["变电所"].Rows.Count; j++)
                    {
                        if (myDataSet.Tables["变电所"].Rows[j][0].ToString().Trim() != "")
                        {
                            comboBox2.Items.Add(myDataSet.Tables["变电所"].Rows[j][0].ToString().Trim());
                        }
                    }
                    comboBox2.SelectedIndex = 0;
                }
                selectCmd1 = "Select distinct  馈线名称 From 馈线 where 公司='" + comboBox1.Text.Trim() + "'and 变电站='" + comboBox2.Text.Trim() + "'";
                myAdapter = new SqlDataAdapter(selectCmd1, conn);
                myAdapter.Fill(myDataSet, "馈线名称");
                if (myDataSet.Tables["馈线名称"].Rows.Count > 0)
                {
    
                    for (int j = 0; j < myDataSet.Tables["馈线名称"].Rows.Count; j++)
                    {
                        if (myDataSet.Tables["馈线名称"].Rows[j][0].ToString().Trim() != "")
                        {
                            comboBox3.Items.Add(myDataSet.Tables["馈线名称"].Rows[j][0].ToString().Trim());
                        }
                    }
                    comboBox3.SelectedIndex = 0;
                }
    
            }

    知识改变命运,奋斗成就人生!
    • 已标记为答案 yanbing 2009年8月12日 10:38
    2009年8月12日 10:16
    版主

全部回复

  • 很明显你在创建第一个 Combobox 触发了 SelectIndexChanged 事件,这时已在 Combobox2 中创建 了一部分数据,你后面又对 Combobox2 创建了其它项,当然有可能重了
    要么在创建第二个 Combobox 前执行 comboBox2.Items.Clear(); 要么把  comboBox1.SelectedIndex = 0; 放到 Form_Load 的最后面


             另外你的实现方式也不是最好的,
    1. 所有相关数据可以一次性读取出来,
    2. 使用 BindingSource 对 Combobox 进行绑定
    3. SqlDataAdapter 使用了要显示释放,最好用 using




    知识改变命运,奋斗成就人生!
    • 已标记为答案 yanbing 2009年8月12日 10:19
    2009年8月12日 10:01
    版主
  • private void xianlujiegou_Load(object sender, EventArgs e)
            {
                ////////向combobox中添加数据库表中的列/////////////
                string selectCmd, selectCmd1;
                selectCmd = "Select distinct 公司 From 馈线";
                conn = new SqlConnection(connStr);
                myAdapter = new SqlDataAdapter(selectCmd, conn);
                myAdapter.Fill(myDataSet, "公司");
                if (myDataSet.Tables["公司"].Rows.Count > 0)
                {
                    for (int j = 0; j < myDataSet.Tables["公司"].Rows.Count; j++)
                    {
                        if (myDataSet.Tables["公司"].Rows[j][0].ToString().Trim() != "")
                        {
                            comboBox1.Items.Add(myDataSet.Tables["公司"].Rows[j][0].ToString().Trim());
                        }
                    }
                    comboBox1.SelectedIndex = 0;
                }
                ////////根据公司选择变电站//////////
    
                // 这里注意
                comboBox2.Text = "";
                comboBox2.Items.Clear();
    
    
                selectCmd1 = "Select distinct  变电站 From 馈线 where 公司='" + comboBox1.Text.Trim() + "'";
                myAdapter = new SqlDataAdapter(selectCmd1, conn);
                myAdapter.Fill(myDataSet, "变电所");
                if (myDataSet.Tables["变电所"].Rows.Count > 0)
                {
    
                    for (int j = 0; j < myDataSet.Tables["变电所"].Rows.Count; j++)
                    {
                        if (myDataSet.Tables["变电所"].Rows[j][0].ToString().Trim() != "")
                        {
                            comboBox2.Items.Add(myDataSet.Tables["变电所"].Rows[j][0].ToString().Trim());
                        }
                    }
                    comboBox2.SelectedIndex = 0;
                }
                selectCmd1 = "Select distinct  馈线名称 From 馈线 where 公司='" + comboBox1.Text.Trim() + "'and 变电站='" + comboBox2.Text.Trim() + "'";
                myAdapter = new SqlDataAdapter(selectCmd1, conn);
                myAdapter.Fill(myDataSet, "馈线名称");
                if (myDataSet.Tables["馈线名称"].Rows.Count > 0)
                {
    
                    for (int j = 0; j < myDataSet.Tables["馈线名称"].Rows.Count; j++)
                    {
                        if (myDataSet.Tables["馈线名称"].Rows[j][0].ToString().Trim() != "")
                        {
                            comboBox3.Items.Add(myDataSet.Tables["馈线名称"].Rows[j][0].ToString().Trim());
                        }
                    }
                    comboBox3.SelectedIndex = 0;
                }
    
            }

    知识改变命运,奋斗成就人生!
    • 已标记为答案 yanbing 2009年8月12日 10:38
    2009年8月12日 10:16
    版主
  • 谢谢,我把combobox2.items.clear();加在  ////////根据公司选择变电站//////////注释前面了,解决了,谢谢!你的回答每次都对我有帮助!谢谢!   你说的:另外你的实现方式也不是最好的,我以后会想想.谢谢!
    1. 所有相关数据可以一次性读取出来,
    2. 使用 BindingSource 对 Combobox 进行绑定
    3. SqlDataAdapter 使用了要显示释放,最好用 using


    2009年8月12日 10:18