如何修复“组合框选择的索引始终显示第一个值C#”

时间:2019-04-18 06:22:31

标签: c#

我有一个Windows窗体应用程序,该应用程序在加载时会用来自mysql的数据填充我的组合框。但是在加载时,我需要首先获取一个空值,而不要从组合框中选择第一个。

我尝试过combobox.SelectedIndex = -1; 它可以工作,但是我使用消息提示进行调试,并且可以看到消息在显示任何内容之前都显示了组合框中的第一个值。

void Fillcombo()
{
    DataTable tb = new DataTable("candidate_l");
    connection.Open();
    string QueryPres = "SELECT candidate_nu, CONCAT(candidate_n, ' ' ,candidate_s) AS fullname FROM candidate_l WHERE candidate_p = 'PRES'";
    cmd = new MySqlCommand(QueryPres, connection);
    mdr = cmd.ExecuteReader();

    tb.Load(mdr);

    cbo_President.ValueMember = "candidate_nu";
    cbo_President.DisplayMember = "fullname";
    cbo_President.DataSource = tb;
    cbo_President.SelectedIndex = -1;
    cbo_President.Text = "No Selection";

    connection.Close();
}

private void cbo_President_SelectedIndexChanged(object sender, EventArgs e)
{
    if (cbo_President.SelectedIndex > -1)
    {
        string cbopres = cbo_President.SelectedValue.ToString();
        MessageBox.Show("Candidate ID : " + cbopres);
    }
    else if (cbo_President.SelectedIndex == -1)
    {
        MessageBox.Show("Candidate ID : none");
    }
}

我需要在else if语句上收到消息Candidate ID : none。因为我在组合框中获得了第一项的Candidate ID

3 个答案:

答案 0 :(得分:0)

一种常见的解决方案,可以在设置/初始化控件时删除事件处理程序,并在初始化后添加事件处理程序。

        comboBox1.SelectedIndexChanged -= comboBox1_SelectedIndexChanged;
        comboBox1.DataSource = test;
        comboBox1.SelectedIndex = -1;
        comboBox1.SelectedIndexChanged += comboBox1_SelectedIndexChanged;

答案 1 :(得分:0)

设置cbo_President对象的数据源后,在位置0插入空白选项,然后执行SelectedIndex = 0。即。

cbo_President.ValueMember = "candidate_nu";
cbo_President.DisplayMember = "fullname"; 
cbo_President.DataSource = tb;
cbo_President.Items.Insert(0, "No Selection");
cbo_President.SelectedIndex = 0;

答案 2 :(得分:0)

您可以在绑定到组合框之前向您的DataTable添加一个“空”行:

DataRow dr = tb.NewRow();
dr["candidate_nu"] = -1;
dr["fullname"] = string.Empty; // or "No Selection"

tb.Rows.InsertAt(dr, 0);

cbo_President.ValueMember = "candidate_nu";
cbo_President.DisplayMember = "fullname";
cbo_President.DataSource = tb;