基于单击另一个更改comboBox值

时间:2016-11-17 15:40:43

标签: c# sql winforms

我有两个函数,第一个函数用我的SQL数据库中的表填充一个comboBox,如下所示:

   private void FillCombo()
    {
        comboBox1.Items.Clear();
        try
        {

            string connectionString = "Data Source=LPMSW09000012JD\\SQLEXPRESS;Initial Catalog=Pharmacies;Integrated Security=True";
            using (SqlConnection con2 = new SqlConnection(connectionString))
            {
                con2.Open();
                string query = "SELECT * FROM INFORMATION_SCHEMA.TABLES ";
                SqlCommand cmd2 = new SqlCommand(query, con2);

                SqlDataReader dr2 = cmd2.ExecuteReader();
                while (dr2.Read())
                {
                    int col = dr2.GetOrdinal("TABLE_NAME");
                    comboBox1.Items.Add(dr2[col].ToString());
                }
                comboBox1.SelectedIndex = 0;
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

我还有另一个根据前一个函数组合框的值填充第二个comboBox。这是下面的

    async void fillLiguanea()
    { 
        comboBox2.Items.Clear();

            try
            {

                string connectionString = "Data Source=LPMSW09000012JD\\SQLEXPRESS;Initial Catalog=Pharmacies;Integrated Security=True";
                SqlConnection con = new SqlConnection(connectionString);
                con.Open();
                string query = "SELECT * FROM " + comboBox1.Text;
                SqlCommand cmd = new SqlCommand(query, con);
                var reader = await cmd.ExecuteReaderAsync();
                comboBox2.BeginUpdate();
                while (reader.Read())
                {
                    string scode = reader.GetString(reader.GetOrdinal("code"));
                    comboBox2.Items.Add(scode);
                }
                comboBox2.EndUpdate();
                comboBox2.SelectedIndex = 0;

            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.ToString());
            }}

我们要做的是根据“fillCombo”函数中选择的表刷新“fillLiguanea”函数的comboBox值。例如。如果在我的comboBox中有一个名为“cat”和“dog”的表格被“fillLiguanea”填充,那么当它被选中时,它应该自动更改由“fillLiguanea”填充的各种猫或狗品种的组合框。

我正在阅读并看到有关SelectionChangeCommitted事件的信息。这是要走的路还是有更好的方法来做到这一点?

我通过一个针对我的第二个comboBox的刷新按钮实现了这一点,但我宁愿不再为用户使用按钮

2 个答案:

答案 0 :(得分:0)

您必须使用events

请参阅:https://msdn.microsoft.com/en-us/library/awbftdfh.aspxhttps://msdn.microsoft.com/en-us/library/edzehd2t(v=vs.110).aspx

简而言之,事件只是一种通过跟随Observer Pattern来触发代码的方式。

基本上,一个事件表示多个方法(我将这些方法称为“订阅方法”,因为它们“订阅”事件),当从定义的类中引发事件时,所有方法都被调用。 “好的,”你可能会说。 “但是当实现在引发事件时要调用的方法时,如何确保我有正确的参数类型?”。 Delegates

委托表示方法的签名(即参数数量/参数类型/方法的返回类型)。每个事件都被声明为特定委托的类型。

例如,假设您希望在收到任意消息时调用其订阅方法的事件。你会如何使用这些称为“事件”的东西设置这样的系统?

  1. 定义您的代理

    public delegate void MessageDelegate(string data);

    这意味着(并强制执行)事件的所有订阅方法必须只包含一个参数,并且其类型必须为string。此外,每个订阅方法都不得返回任何值。

  2. 定义您的活动

    public event MessageDelegate MessageReceived;

    这表示我们创建了一个事件(订阅方法的集合),其中每个订阅方法必须与委托MessageDelegate定义的签名匹配。

  3. 订阅您的活动(可能是您最感兴趣的部分) 要订阅事件(或向事件的订阅者集合添加方法),首先必须创建一个与委托匹配的方法:

    private void OnMessageReceived(string msg) { //Do something with the received message. }

    然后是实际的订阅:

    MessageReceived += new MessageDelegate(OnMessageReceived)

    现在每当触发事件时,我们都会调用OnMessageReceived方法。

  4. 最后,要触发或引发事件(调用每个订阅方法的过程),您只需执行以下操作: MessageReceived("Hello World!")
  5. 所有这些,这是如何适用于您的特定问题的? 好吧,组合框控件已经包含了这个事件。所以你显然不必自己定义。这意味着你所负责的只是订阅活动。

    comboBox1.SelectionChangeCommitted += new EventHandler(comboBox1_SelectionChangeCommitted);
    
    private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)
    {
        //Refresh combobox 2.
    }
    

    我建议您将实际订阅放在表单的Form_Load事件中。

    private void Form1_Load(object sender, EventArgs e)
    {
        comboBox1.SelectionChangeCommitted += new EventHandler(comboBox1_SelectionChangeCommitted);
    }
    

    但是,现在您必须订阅表单的加载事件。通常在构造函数中完成InitializeComponent的调用。

    public Form1()
    {
        InitializeComponent();
        Load += new EventHandler(Form1_Load);
    }
    

    您当然可以绕过表单加载订阅

    public Form1()
    {
        InitializeComponent();
        comboBox1.SelectionChangeCommitted += new EventHandler(comboBox1_SelectionChangeCommitted);
    }
    

    最后,如果您在Visual Studio中使用WindowsForms设计器: 在属性窗格的某处,应该有一种方法来查看所选控件的事件。向下滚动到您想要的活动。双击它。 Visual Studio应该自动创建一个方法并使用新方法订阅该事件。

    事件和代表背后有很多力量。我强烈建议你阅读一下。 对不起,这并不像我想象的那么小,但我想我会尝试解释为什么它的工作原理,而不仅仅是“这就是它应该如何完成的。”。

答案 1 :(得分:0)

这是一个简单的解决方案。我只是将fillbobo函数中的comboBox传递给fillLiguanea函数,一切都按照我的意愿运行。这两个功能如下:

这是fillCombo方法,它从SQL数据库填充到我的comboBox,名为" comboBox4"

private void FillCombo()
    {



            comboBox4.Items.Clear();


            try
            {

                string connectionString = "Data Source=LPMSW09000012JD\\SQLEXPRESS;Initial Catalog=Pharmacies;Integrated Security=True";
                using (SqlConnection con2 = new SqlConnection(connectionString))
                {
                    con2.Open();
                    string query = "SELECT * FROM INFORMATION_SCHEMA.TABLES ";
                    SqlCommand cmd2 = new SqlCommand(query, con2);

                    SqlDataReader dr2 = cmd2.ExecuteReader();
                    while (dr2.Read())
                    {
                        int col = dr2.GetOrdinal("TABLE_NAME");
                        comboBox4.Items.Add(dr2[col].ToString());
                    }
                   // comboBox4.SelectedIndex = 0;

                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

这是我的fillLiguanea方法,它根据我上面函数中的comboBox4选项更新表。

  async void fillLiguanea()
    {
        comboBox2.Items.Clear();
        try
        {

            string connectionString = "Data Source=LPMSW09000012JD\\SQLEXPRESS;Initial Catalog=Pharmacies;Integrated Security=True";
            SqlConnection con = new SqlConnection(connectionString);
            con.Open();
            string query = "SELECT * FROM " + comboBox4.Text;
            SqlCommand cmd = new SqlCommand(query, con);
            var reader = await cmd.ExecuteReaderAsync();
            comboBox2.BeginUpdate();
            while (reader.Read())
            {
                string scode = reader.GetString(reader.GetOrdinal("code"));
                comboBox2.Items.Add(scode);
            }
            comboBox2.EndUpdate();
            comboBox2.SelectedIndex = 0;
            // comboBox2.Sorted = true;
        }

这是重要的代码行:

string query = "SELECT * FROM " + comboBox4.Text;

随着一切都解决了