C# 以编程方式填充ComboBox时不会触发任何事件
为了使其尽可能简单:ComboBox1绑定到一个空列表(在Form1 load event handler中),并且有一个与ComboBox1关联的事件处理程序:C# 以编程方式填充ComboBox时不会触发任何事件,c#,winforms,events,combobox,C#,Winforms,Events,Combobox,为了使其尽可能简单:ComboBox1绑定到一个空列表(在Form1 load event handler中),并且有一个与ComboBox1关联的事件处理程序: private void CB1_SelectedIndexChanged(object sender, EventArgs e) { MessageBox.Show("Event fired"); } private void Form1_Load(object sender, EventArgs e) { CB
private void CB1_SelectedIndexChanged(object sender, EventArgs e)
{
MessageBox.Show("Event fired");
}
private void Form1_Load(object sender, EventArgs e)
{
CB1.DataSource = list1;
CB1.ValueMember = "Name";
CB1.DisplayMember = "Name";
}
已加载表单,CB1.SelectedIndex=-1,CB1.Text=“”,CB1.Items.Count=0
当我点击按钮1时,列表1被填充。现在情况如下:
CB1.SelectedIndex=0,CB1.Text=“一些文本”,CB1.Items.Count=196
但是,虽然SelectedIndex从-1更改为0,并且我没有得到MessageBox.Show(“事件已激发”),但事件没有激发。但是,当用户从列表中选择某个项目时,将触发事件。此外,还有另一个按钮用于清除列表1,从而清除CB1.Items。按下此按钮时,事件也会触发(SelectedIndex从X变为-1)
我尝试使用其他事件,如SelectedValueChanged、TextChanged、SelectionChangeCommitted,但没有成功
虽然这个问题有一个简单的暴力解决方法,但我仍然不理解为什么问题首先出现,因此无法预测类似的情况。这就是为什么如果有人向我解释为什么在我描述的情况下没有发生任何事件,我将不胜感激。我的评论得到了足够的关注,因此我应该将此作为一个可能的答案。您应该确保您已经通过委托或在具有组合框本身属性的设计器中将事件实际分配给该方法
// Somewhere in the form load or init events
CB1.SelectedIndexChanged += new EventHandler(CB1_SelectedIndexChanged);
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
this.button1.Click+=new System.EventHandler(this.comboBox1\u SelectionChangeCommitted);
}
私有void Form1\u加载(对象发送方、事件参数e)
{
列表=新列表{“a”、“b”、“c”};
comboBox1.DataSource=列表;
comboBox1.SelectedIndex=0;
}
private void comboBox1\u SelectionChangeCommitted(对象发送方,事件参数e)
{
Show(comboBox1.SelectedValue.ToString());
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
comboBox1.SelectedIndex=1;
}
}
您可以自己用自己的事件参数来调用它。您实际分配过该事件吗CB1.SelectedIndexChanged+=新的事件处理程序(CB1\u SelectedIndexChanged)
@Joel:我犯了那个错误,我挠头了几分钟。事件处理程序通常不受保护吗?我认为您应该使用更具体的EventArgs
。@糟糕的是,事件处理程序通常是私有的,至少Visual Studio创建私有方法。另外,SelectedIndexChanged事件使用EventArgs。@kashif:除非您正在微调一些非常敏感的事件顺序,否则应该是非常好的。在提交(验证、确认、修改?)之前,有时您可能希望在用户更改事件SelectedIndexChanged
中断操作,但在大多数情况下,它们的行为应该是等效的。我认为这不会解决他的问题。因为我想在combobox1的索引被按钮更改时调用selectedindexchanged事件。单击事件
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.button1.Click += new System.EventHandler(this.comboBox1_SelectionChangeCommitted);
}
private void Form1_Load(object sender, EventArgs e)
{
List<string> list = new List<string> { "a", "b", "c" };
comboBox1.DataSource = list;
comboBox1.SelectedIndex = 0;
}
private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)
{
MessageBox.Show(comboBox1.SelectedValue.ToString());
}
private void button1_Click(object sender, EventArgs e)
{
comboBox1.SelectedIndex = 1;
}
}