我正在做我的第一个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元素将位于不同的线程上。
答案 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
语句中,该语句会自动关闭并在该块的末尾放置该连接。
如果文本框始终相同,则无需将其作为参数传递。