2 个组合框的相同 SelectedIndexChanged 函数 c#
Same SelectedIndexChanged function for 2 comboboxes c#
我为 2 个组合框创建了一个相同的事件来填充我的输入控件,这样用户就可以看到他们要删除或更新的内容。当我制作单独的事件时它有效但在制作相同的事件时它不起作用。我应该在 if 语句中加入什么条件
在这个 if 条件下 error 我得到 id "Index was outside the bounds of the array"
private void BoardComboBo(object sender, EventArgs e)
{
if (comboBox12.SelectedIndex!=0)//error is here
{
con.Open();
cmd = new SqlCommand("Select * from Users where user_Id='" + comboBox12.Text + "';", con);
SqlDataReader DR1 = cmd.ExecuteReader();
if (DR1.Read())
{
//code to fill textboxes
}
con.Close();
}
if(comboBox1.SelectedIndex!=0)//error is here
{
//to split combobox values
string selectedvalue = comboBox1.Text;
split = selectedvalue.Split();
//add values on fields
con.Open();
cmd = new SqlCommand("Select * from Users where firstName='" + split[0] + "' and lastName='" + split[1] + "';", con);
SqlDataReader DR1 = cmd.ExecuteReader();
if (DR1.Read())
{
//code to fill textboxes
}
con.Close();
}
}
第二个if条件我也改了:
if (comboBox12.Text!=" ")// this works
{
//to split combobox values
string selectedvalue = comboBox1.Text;
split = selectedvalue.Split();
//add values on fields
con.Open();
cmd = new SqlCommand("Select * from Users where firstName='" + split[0] + "' and lastName='" + split[1] + "';", con);
SqlDataReader DR1 = cmd.ExecuteReader();
if (DR1.Read())
{
//code to fill textboxes
}
con.Close();
}
当我尝试通过 user_Id
select 时,我现在遇到与上面相同的错误
在方法签名中,sender
对象是触发事件的对象,因此我们可以将其转换为 ComboBox
并检查它是否是我们关心的对象:
private void BoardComboBo(object sender, EventArgs e)
{
var comboBox = sender as ComboBox;
if (comboBox == comboBox1)
{
// comboBox1 code here
}
else if (comboBox == comboBox12)
{
// comboBox12 code here
}
}
但是此时,您可能还有两个单独的事件。由于没有特定于 ComboBox 的重要重复代码,因此将它们重构为一个事件只会使代码更加繁琐。
关于 "Index was outside the bounds of the array"
错误,您唯一引用索引的地方是拆分 comboBox1
的 Text
属性 时。最有可能的是,Text
中没有任何空格,因此 Split
返回一个单项数组。那么问题是当您尝试访问此处不存在的索引时:
split[1] // Here you're attempting to access an index that doesn't exist
要解决此问题,请在访问可能不存在的索引之前检查数组的 Length
,可能类似于:
// Set the last name to an empty string if it didn't exist
var lastName = split.Length > 1 ? split[1] : string.Empty;
请注意,您应该使用 SQL 命令参数来构建查询字符串。你这样做的方式很容易受到 SQL 注入。
此外,正如@Streamline 提到的,您的原始代码有两个 if
块而不是 if / else if
。这意味着无论哪个控件触发事件,都将评估 if
条件。这也意味着如果两个 ComboBoxes 都有一个非零 SelectedIndex
,那么 both if
块体将 运行。这可能是您问题中代码错误的原因,并且不太可能是预期的行为。
最后,正如@OlivierJacot-Descombes 提到的,如果没有选择任何项目,那么 SelectedIndex
将是 -1
,而不是 0
。这意味着当您检查 comboBox1.SelectedIndex!=0
时,您不仅会忽略第一个 (0
) 位置的值,而且如果没有选择任何值,那么它将通过此条件(因为值在这种情况是 -1
).
我为 2 个组合框创建了一个相同的事件来填充我的输入控件,这样用户就可以看到他们要删除或更新的内容。当我制作单独的事件时它有效但在制作相同的事件时它不起作用。我应该在 if 语句中加入什么条件
在这个 if 条件下 error 我得到 id "Index was outside the bounds of the array"
private void BoardComboBo(object sender, EventArgs e)
{
if (comboBox12.SelectedIndex!=0)//error is here
{
con.Open();
cmd = new SqlCommand("Select * from Users where user_Id='" + comboBox12.Text + "';", con);
SqlDataReader DR1 = cmd.ExecuteReader();
if (DR1.Read())
{
//code to fill textboxes
}
con.Close();
}
if(comboBox1.SelectedIndex!=0)//error is here
{
//to split combobox values
string selectedvalue = comboBox1.Text;
split = selectedvalue.Split();
//add values on fields
con.Open();
cmd = new SqlCommand("Select * from Users where firstName='" + split[0] + "' and lastName='" + split[1] + "';", con);
SqlDataReader DR1 = cmd.ExecuteReader();
if (DR1.Read())
{
//code to fill textboxes
}
con.Close();
}
}
第二个if条件我也改了:
if (comboBox12.Text!=" ")// this works
{
//to split combobox values
string selectedvalue = comboBox1.Text;
split = selectedvalue.Split();
//add values on fields
con.Open();
cmd = new SqlCommand("Select * from Users where firstName='" + split[0] + "' and lastName='" + split[1] + "';", con);
SqlDataReader DR1 = cmd.ExecuteReader();
if (DR1.Read())
{
//code to fill textboxes
}
con.Close();
}
当我尝试通过 user_Id
select 时,我现在遇到与上面相同的错误在方法签名中,sender
对象是触发事件的对象,因此我们可以将其转换为 ComboBox
并检查它是否是我们关心的对象:
private void BoardComboBo(object sender, EventArgs e)
{
var comboBox = sender as ComboBox;
if (comboBox == comboBox1)
{
// comboBox1 code here
}
else if (comboBox == comboBox12)
{
// comboBox12 code here
}
}
但是此时,您可能还有两个单独的事件。由于没有特定于 ComboBox 的重要重复代码,因此将它们重构为一个事件只会使代码更加繁琐。
关于 "Index was outside the bounds of the array"
错误,您唯一引用索引的地方是拆分 comboBox1
的 Text
属性 时。最有可能的是,Text
中没有任何空格,因此 Split
返回一个单项数组。那么问题是当您尝试访问此处不存在的索引时:
split[1] // Here you're attempting to access an index that doesn't exist
要解决此问题,请在访问可能不存在的索引之前检查数组的 Length
,可能类似于:
// Set the last name to an empty string if it didn't exist
var lastName = split.Length > 1 ? split[1] : string.Empty;
请注意,您应该使用 SQL 命令参数来构建查询字符串。你这样做的方式很容易受到 SQL 注入。
此外,正如@Streamline 提到的,您的原始代码有两个 if
块而不是 if / else if
。这意味着无论哪个控件触发事件,都将评估 if
条件。这也意味着如果两个 ComboBoxes 都有一个非零 SelectedIndex
,那么 both if
块体将 运行。这可能是您问题中代码错误的原因,并且不太可能是预期的行为。
最后,正如@OlivierJacot-Descombes 提到的,如果没有选择任何项目,那么 SelectedIndex
将是 -1
,而不是 0
。这意味着当您检查 comboBox1.SelectedIndex!=0
时,您不仅会忽略第一个 (0
) 位置的值,而且如果没有选择任何值,那么它将通过此条件(因为值在这种情况是 -1
).