C# 2个组合框c的相同SelectedIndexChanged函数

C# 2个组合框c的相同SelectedIndexChanged函数,c#,combobox,selectedindexchanged,C#,Combobox,Selectedindexchanged,我为2个组合框制作了相同的事件来填充我的输入控件,以便用户可以看到他们将删除或更新的内容。当我制作单独的事件时,它起作用,但在制作相同的事件时,它不起作用。我应该在if语句中设置什么条件 在这种情况下,如果错误i get id Index超出数组的界限 我也更改了第二个if条件: if (comboBox12.Text!=" ")// this works { //to split combobox values

我为2个组合框制作了相同的事件来填充我的输入控件,以便用户可以看到他们将删除或更新的内容。当我制作单独的事件时,它起作用,但在制作相同的事件时,它不起作用。我应该在if语句中设置什么条件

在这种情况下,如果错误i get id Index超出数组的界限

我也更改了第二个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();
}

现在,当我尝试在方法签名中按用户Id选择时,我遇到了上述相同的错误,发送者对象是触发事件的对象,因此我们可以将其强制转换为组合框,并检查它是否是我们关心的对象:

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
    }
}
然而,在这一点上,你也可以有两个独立的事件。由于没有特定于组合框的重要重复代码,因此将它们重构为一个事件只会使代码更加繁琐

关于索引超出数组错误的范围,您引用索引的唯一位置是拆分comboBox1的Text属性时。最有可能的是,文本中没有任何空格,因此Split返回的是单个项数组。然后,问题是当您尝试访问此处不存在的索引时:

split[1]  // Here you're attempting to access an index that doesn't exist
要解决此问题,请在访问可能不存在的索引之前检查数组的长度,例如:

// 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条件进行评估。这还意味着,如果两个组合框都具有非零SelectedIndex,则两个if块体都将运行。这可能是问题代码中出现错误的原因,并且不太可能是预期的行为


最后,正如@OlivierJacot Descombes提到的,如果没有选择任何项目,那么SelectedIndex将是-1,而不是0。这意味着当您检查comboBox1.SelectedIndex=0,不仅忽略第一个0位置的值,而且如果未选择任何值,则它将通过此条件,因为在这种情况下,值为-1。

错误是什么?在这种情况下,我得到的索引超出了阵列的边界。您希望它根据哪个组合执行完全不同的操作,你为什么要合并它?此外,这从来都不是为网络应用程序构建SQL的正确方法-它非常容易出错,甚至很危险。它填充相同的表单,一个按id填充,另一个按名字和姓氏填充。这就是为什么我认为最好将事件组合在一起。如果未选择任何项目,则返回负1的值。因此,您应该测试comboBox==comboBox1&&comboBox1.SelectedIndex>=0。第二个也一样。错误不能放在//error is here注释所在的位置,因为那里没有数组访问权。@OlivierJacot Descombes在SelectedIndexChanged事件中可能发生这种情况吗?可能可以通过设置SelectedItem=null来触发;或选择索引=-1。但是原始代码comboBox1.SelectedIndex=0很可能是错误的。与其编写我自己的答案,不如在答案的第二部分中添加以下内容:调用事件处理程序时可以运行两个if块的代码,因为他使用两个if而不是if。。。{}如果。。。{ }. 这可能是异常的原因,因为正如您已经提到的,文本无效。
// Set the last name to an empty string if it didn't exist
var lastName = split.Length > 1 ? split[1] : string.Empty;