如何防止重复的组合框选择更改事件方法?

时间:2019-04-30 15:37:48

标签: c# mysql database wpf combobox

我正在做我的第一个C#项目,该项目不是来自教程,而且正在变得越来越大。

它可以工作,但是我必须复制并通过多种方法对不同的选择执行相同的操作。我有8个不同的组合框以及相应的文本框。目前,我能做的就是为每个组合框创建一个单独的方法。

这是我的一种方法的示例。每当我从组合框中选择一个新项目时,都会使用适当的序列号更新文本框。

private void StationComboBox_1_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
    string constring = "datasource=localhost; username=PC;password=pw;"; 
    string query = "SELECT * from db.units where station_Units='"+ stationComboBox_1.SelectedItem +"';";
    MySqlConnection conDataBase = new MySqlConnection(constring);
    MySqlCommand cmdDataBase = new MySqlCommand(query, conDataBase);
    MySqlDataReader myReader;

    try
    {
        conDataBase.Open();
        myReader = cmdDataBase.ExecuteReader();
        while (myReader.Read())
        {
            string serial = myReader.GetString("serial_Units");
            serial_1.Text = serial;
        }
    }

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

就目前情况而言,我只需要更改组合框名称,就必须再创建7个该方法的副本。我很肯定这不是正确的方法。

我想大幅缩减代码,但是我真的不确定如何缩减代码。我尝试制作一个新班级以供参考,但我完全迷路了。据我所知,我不能使用其他类,因为UI元素将位于不同的线程上。

1 个答案:

答案 0 :(得分:3)

创建一个接受变化部分(组合框和文本)作为参数的方法。

private void StationComboBox_1_SelectionChanged(object sender,
    System.Windows.Controls.SelectionChangedEventArgs e)
{
    UpdateTextFromSelection(stationComboBox_1, serial_1);
}

private void UpdateTextFromSelection(ComboBox comboBox, TextBox serialTextBox)
{
    string constring = "datasource=localhost; username=PC;password=pw;";
    string query = "SELECT serial_Units from db.units where station_Units=@unit;";
    using (var conn = new MySqlConnection(constring)) {
        var cmd = new MySqlCommand(query, conn);
        cmd.Parameters.Add("@unit", comboBox.SelectedItem);

        try {
            conn.Open();
            serialTextBox.Text = (string)cmd.ExecuteScalar();
        } catch (Exception ex) {
            MessageBox.Show(ex.Message);
        }
    }
}

由于您正在检索文本框的单个值,因此可以使用ExecuteScalar方法读取创建读取器的方法。 ExecuteScalar返回第一行的第一列,因此在选择列表中指定serial_Units列,而不只是*

请注意,我在示例中使用了parametrized query。它通常更易于使用,因为您不必在字符串中转义单引号,也不必担心以正确的方式格式化日期或数字。不要将参数名称用SQL文本括在引号中。而且,它可以保护您免受SQL Injections的侵害。

我还将连接对象括在using语句中,该语句会自动关闭并在该块的末尾放置该连接。

如果文本框始终相同,则无需将其作为参数传递。