0

我想在加载表单时将数据表中的一些键/值填充到组合框中。并期望当用户在组合框上进行选择时,某些语句会在 SelectedValueChanged 事件中执行。

但是,当我使用以下填充数据时:

    private void Form1_Load(object sender, EventArgs e)
    {
        comboBox1.DropDownStyle =  ComboBoxStyle.DropDownList;

        DataTable dt = new DataTable();
        dt.Columns.Add("id", typeof(int));
        dt.Columns.Add("name", typeof(string));

        dt.Rows.Add(1, "A1");
        dt.Rows.Add(2, "A2");
        comboBox1.DataSource = dt;
        comboBox1.DisplayMember = "name";
        comboBox1.ValueMember = "id";   
    }

使用以下 SelectedValueChanged 事件:

    private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
    {
        MessageBox.Show("FOO");

    }

程序运行后,“foo”消息框会意外显示两次,然后用户才能选择任何内容。

问题是什么?

谢谢

4

3 回答 3

0

添加到KINGKING的答案..

private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
{
    if(init) Return;

    //codes here
}
于 2013-06-19T17:46:57.590 回答
0

ComboBox而是通过设计器,在事件处理程序末尾填写后注册您的事件处理Form_Load程序:

private void Form1_Load(object sender, EventArgs e)
{
    comboBox1.DropDownStyle =  ComboBoxStyle.DropDownList;

    DataTable dt = new DataTable();
    dt.Columns.Add("id", typeof(int));
    dt.Columns.Add("name", typeof(string));

    dt.Rows.Add(1, "A1");
    dt.Rows.Add(2, "A2");
    comboBox1.DataSource = dt;
    comboBox1.DisplayMember = "name";
    comboBox1.ValueMember = "id";
    comboBox1.SelectedValueChanged += comboBox1_SelectedValueChanged   
}
于 2013-06-19T16:46:56.343 回答
0

问题是设计使然,当您的组合框用新项目更新时SelectedValue,它的设计会改变。为了防止这种情况,您可以使用某种标志,如下所示:

private bool init;
 private void Form1_Load(object sender, EventArgs e)
{
    comboBox1.DropDownStyle =  ComboBoxStyle.DropDownList;

    DataTable dt = new DataTable();
    dt.Columns.Add("id", typeof(int));
    dt.Columns.Add("name", typeof(string));

    dt.Rows.Add(1, "A1");
    dt.Rows.Add(2, "A2");
    init = true;
    comboBox1.DataSource = dt;
    comboBox1.DisplayMember = "name";
    comboBox1.ValueMember = "id";   
    init = false;
}
private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
{
    if(!init) MessageBox.Show("FOO");
}
于 2013-06-19T16:37:36.767 回答