WinForms SelectedIndexChangeCommitted 未触发
WinForms SelectedIndexChangeCommitted not firing
我正在从数据源填充一个组合框,并且我有用于当用户更改组合框中的选择时的代码。所以显然我不希望 SelectedIndexChanged 方法中的代码在表单加载时触发。
This SO question 通过建议两件事来回答:
1) 在将数据加载到组合框之前和之后使用此代码:
private void LoadYourComboBox()
{
this.comboBox1.SelectedIndexChanged -= new EventHandler(comboBox1_SelectedIndexChanged);
// Set your bindings here . . .
this.comboBox1.SelectedIndexChanged += new EventHandler(comboBox1_SelectedIndexChanged);
}
我用这段代码试过了:
this.cboSelectCategory.SelectedIndexChanged -= new EventHandler(cboSelectCategory_SelectedIndexChanged);
但是,cboSelectCategory_SelectedIndexChanged
部分有一个红色波浪形错误,悬停在它上面说:The name cboSelectCategory_SelectedIndexChanged does not exist in the current context
。我在 form_load 和实际填充组合框的方法中都尝试了该代码。
2) 同一个 SO 问题的答案是使用事件 SelectedIndexChangeCommitted
。
private void cboSelectCompany_SelectedIndexChangeCommitted(object sender, EventArgs e)
{
string selectedCat = cboSelectCategory.SelectedValue.ToString();
Console.WriteLine(selectedCat);
}
但是当我更改组合框中的选择时,该事件没有触发。
我是不是漏了什么地方?我的代码是关闭还是在错误的地方?
So obviously I don't want the code in the SelectedIndexChanged method to fire on form load.
如果您在表单的构造函数中绑定您的组合框(在 InitializeComponent()
之后),那么 SelectedIndexChanged
将在表单可见之前触发,因此您可以简单地从 selectedindexchanged 事件中 return 如果表单不可见:
public MainForm()
{
InitializeComponent();
DataTable dt = new DataTable();
dt.Columns.Add("Name");
dt.Columns.Add("Code");
dt.Rows.Add("Milk", "MLK");
dt.Rows.Add("Bread", "BRD_WHITE");
dt.Rows.Add("Bread", "BRD_BROWN");
dt.Rows.Add("Coffee", "COFF");
comboBox1.DataSource = dt;
comboBox1.DisplayMember = "Name";
comboBox1.ValueMember = "Code";
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (!this.Visible)
return;
MessageBox.Show("a");
}
在不想要的时间简单地从事件处理程序中 return 通常比四处尝试删除和添加事件处理程序更容易
旁注:如果您使用强类型数据集并使用 windows 表单设计器创建绑定,事件不会触发,我相信是因为表单设计器 InitializeComponent()
调用 Begin/EndInit 在开始和结束的组件上
我正在从数据源填充一个组合框,并且我有用于当用户更改组合框中的选择时的代码。所以显然我不希望 SelectedIndexChanged 方法中的代码在表单加载时触发。
This SO question 通过建议两件事来回答:
1) 在将数据加载到组合框之前和之后使用此代码:
private void LoadYourComboBox()
{
this.comboBox1.SelectedIndexChanged -= new EventHandler(comboBox1_SelectedIndexChanged);
// Set your bindings here . . .
this.comboBox1.SelectedIndexChanged += new EventHandler(comboBox1_SelectedIndexChanged);
}
我用这段代码试过了:
this.cboSelectCategory.SelectedIndexChanged -= new EventHandler(cboSelectCategory_SelectedIndexChanged);
但是,cboSelectCategory_SelectedIndexChanged
部分有一个红色波浪形错误,悬停在它上面说:The name cboSelectCategory_SelectedIndexChanged does not exist in the current context
。我在 form_load 和实际填充组合框的方法中都尝试了该代码。
2) 同一个 SO 问题的答案是使用事件 SelectedIndexChangeCommitted
。
private void cboSelectCompany_SelectedIndexChangeCommitted(object sender, EventArgs e)
{
string selectedCat = cboSelectCategory.SelectedValue.ToString();
Console.WriteLine(selectedCat);
}
但是当我更改组合框中的选择时,该事件没有触发。
我是不是漏了什么地方?我的代码是关闭还是在错误的地方?
So obviously I don't want the code in the SelectedIndexChanged method to fire on form load.
如果您在表单的构造函数中绑定您的组合框(在 InitializeComponent()
之后),那么 SelectedIndexChanged
将在表单可见之前触发,因此您可以简单地从 selectedindexchanged 事件中 return 如果表单不可见:
public MainForm()
{
InitializeComponent();
DataTable dt = new DataTable();
dt.Columns.Add("Name");
dt.Columns.Add("Code");
dt.Rows.Add("Milk", "MLK");
dt.Rows.Add("Bread", "BRD_WHITE");
dt.Rows.Add("Bread", "BRD_BROWN");
dt.Rows.Add("Coffee", "COFF");
comboBox1.DataSource = dt;
comboBox1.DisplayMember = "Name";
comboBox1.ValueMember = "Code";
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (!this.Visible)
return;
MessageBox.Show("a");
}
在不想要的时间简单地从事件处理程序中 return 通常比四处尝试删除和添加事件处理程序更容易
旁注:如果您使用强类型数据集并使用 windows 表单设计器创建绑定,事件不会触发,我相信是因为表单设计器 InitializeComponent()
调用 Begin/EndInit 在开始和结束的组件上