0

为了使其尽可能简单:ComboBox1 绑定到一个空列表(在 Form1 加载事件处理程序中),并且有一个与 ComboBox1 关联的事件处理程序:

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

当我单击 Button1 时,会填充 list1。现在情况如下:CB1.SelectedIndex = 0, CB1.Text = "Some Text", CB1.Items.Count =196

但是,事件没有触发,尽管 SelectedIndex 从 -1 变为 0,并且我没有得到 MessageBox.Show(“事件触发”)。但是,当用户从列表中选择某个项目时,会触发该事件。此外,还有另一个按钮可以清除 list1,从而清除 CB1.Items。按下此按钮时,事件也会触发(SelectedIndex 从 X 变为 -1)。

我尝试使用其他事件,例如 SelectedValueChanged、TextChanged、SelectionChangeCommitted,但没有成功。

虽然这个问题有一个简单的暴力解决方法,但我仍然不明白为什么会出现这个问题,因此无法预料类似的情况。这就是为什么如果有人向我解释为什么在我描述的情况下没有事件发生,我将不胜感激。

4

2 回答 2

1

我的评论得到了足够的关注,所以我应该把它作为一个潜在的答案似乎是合适的。您应该确保已通过委托或在设计器中使用组合框本身的属性将事件实际分配给方法。

// Somewhere in the form load or init events
CB1.SelectedIndexChanged += new EventHandler(CB1_SelectedIndexChanged);
于 2013-03-07T21:44:55.690 回答
0
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;

    }
}
于 2013-03-07T21:52:17.943 回答