在组合框中相同的两个项目,但第一个总是被选中C#

时间:2015-02-18 10:36:59

标签: c# winforms combobox

我在Windows窗体应用程序中使用combobox时遇到了非常奇怪的问题。

所以我的组合框是使用数据源填充的,它显示了人的名字,并将其ID保存为cmbRequestor.ValueMember。

public BindingSource requestorBindingSource = null;
private const string cmdAssoc = "SELECT * FROM assoc_vw ORDER BY assoc_name";
requestorBindingSource.DataSource = populateDataTable(cmdAssoc);

cmbRequestor.DisplayMember = "assoc_name";
        cmbRequestor.ValueMember = "ID";
        cmbRequestor.DataSource = requestorBindingSource;
        cmbRequestor.SelectedIndex = 0;

enter image description here

它工作正常,但如果有一个同名的人的实例,我从组合框中选择第二个名称(同名),由于某种原因,一旦我关闭组合框,它选择第一个名称,即使我选择了第二个名字。

enter image description here

因此,为了确保它们的名称保持不同的值,我创建了SelectedIndexChanged事件。

private void cmbRequestor_SelectedIndexChanged(object sender, EventArgs e)
    {
        int x = cmbRequestor.SelectedIndex;
        string j = cmbRequestor.SelectedValue.ToString();
        var y = cmbRequestor.Items[x];
    }

当我调试代码并选择第二个名称(同名)时,它后面的ID是3069.一旦我关闭组合框并单击保存以保存表单SelectedIndexChanged再次被触发(这不应该发生)并且它转到第一个具有相同名称的人,其ID不同。

此控件上没有其他事件,我不会在其他任何地方使用它。如果存在相同名称的实例,则控件看起来很混乱。

5 个答案:

答案 0 :(得分:5)

将DropDownStyle属性更改为DropDownList。
默认值为DropDown,在这种情况下,所选项目将由列表中的第一个匹配文本确定。 DropDown主要与自动完成逻辑结合使用。

修改
如果您必须坚持使用DropDown样式,最好的解决方法是处理DropDownClosed事件,此时您将选择正确的索引。

答案 1 :(得分:1)

我发现如果我在Properties中将FormattingEnabled设置为false,那就可以了。

答案 2 :(得分:1)

我也遇到了同样的问题...对我来说,最好的解决方案是将组合框的DropDown Style属性更改为DropDownList。 当我需要DropDown样式时(例如,在组合框中输入新数据)时,我正在将代码中的属性更改为DropDown ...,并在完成后更改回DropDownList。

答案 3 :(得分:0)

尝试使用组合框的ComboBox.SelectionChangeCommitted事件,也许您需要删除默认选择的索引,该索引设置为零

答案 4 :(得分:0)

conn1 = JdbcConn.getConn();

            try
            {

                conn1.Open();

                String sqllogin = "Select *from tbladdpattern  ";
                var cmd = new MySqlCommand(sqllogin, conn1);//This is sql query execute
                var reader = cmd.ExecuteReader();//Execute query

                IList<string> listName = new List<string>();
                while (reader.Read())
                {
                    listName.Add(reader[1].ToString());
                }
               // listName = listName.Distinct().ToList();
                comboBox1.DataSource = listName.Distinct().ToList();



                conn1.Close();//Close DataBase Connection
            }
            catch (Exception ex)
            {
                conn1.Close();
                LogCreate.WriteLog("Errorn in show all pattern " + ex);
            }