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" 错误,您唯一引用索引的地方是拆分 comboBox1Text 属性 时。最有可能的是,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).