组合框中的两个项目相同但第一个总是被选中 C#
Same two items in combobox but first one always gets selected C#
我的 windows 表单应用程序中的组合框出现了非常奇怪的问题。
所以我的组合框是使用数据源填充的,它显示人名并将他们的 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;
它工作正常,但如果有一个同名的人实例和我 select 来自组合框的第二个名字(同名),出于某种原因,一旦我关闭组合框它 select 是第一个名字,尽管我 select 编辑了第二个名字。
因此,为了确保他们根据自己的名字持有不同的值,我创建了 SelectedIndexChanged 事件。
private void cmbRequestor_SelectedIndexChanged(object sender, EventArgs e)
{
int x = cmbRequestor.SelectedIndex;
string j = cmbRequestor.SelectedValue.ToString();
var y = cmbRequestor.Items[x];
}
当我调试代码并且我 select 第二个名称(同名)时,它后面的 ID 是 3069。一旦我关闭组合框并单击“保存”以保存表单,就会再次触发 SelectedIndexChanged(即不应该发生)并且它会转到同名但 ID 不同的第一个人。
此控件上没有其他事件,我没有在其他任何地方使用它。如果存在同名实例,控件似乎会自己混淆。
尝试对组合框使用 ComboBox.SelectionChangeCommitted 事件,也许您需要删除设置为零的默认选定索引
将 DropDownStyle 属性 更改为 DropDownList。
默认值为 DropDown,在这种情况下,所选项目将由列表中第一个匹配的文本确定。 DropDown主要和自动补全逻辑结合使用
编辑:
如果您必须坚持使用 DropDown 样式,最好的解决方法是处理 DropDownClosed 事件,此时您将选择正确的索引。
我发现如果我在属性中将 FormattingEnabled 设置为 false,它会起作用。
我也遇到了同样的问题...对我来说最好的解决方案是将组合框的 DropDown 样式 属性 更改为 DropDownList。
当我需要 DropDown 样式时(例如,在组合框中输入新数据),我在代码中将 属性 更改为 DropDown...并在完成后改回 DropDownList。
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);
}
我的 windows 表单应用程序中的组合框出现了非常奇怪的问题。
所以我的组合框是使用数据源填充的,它显示人名并将他们的 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;
它工作正常,但如果有一个同名的人实例和我 select 来自组合框的第二个名字(同名),出于某种原因,一旦我关闭组合框它 select 是第一个名字,尽管我 select 编辑了第二个名字。
因此,为了确保他们根据自己的名字持有不同的值,我创建了 SelectedIndexChanged 事件。
private void cmbRequestor_SelectedIndexChanged(object sender, EventArgs e)
{
int x = cmbRequestor.SelectedIndex;
string j = cmbRequestor.SelectedValue.ToString();
var y = cmbRequestor.Items[x];
}
当我调试代码并且我 select 第二个名称(同名)时,它后面的 ID 是 3069。一旦我关闭组合框并单击“保存”以保存表单,就会再次触发 SelectedIndexChanged(即不应该发生)并且它会转到同名但 ID 不同的第一个人。
此控件上没有其他事件,我没有在其他任何地方使用它。如果存在同名实例,控件似乎会自己混淆。
尝试对组合框使用 ComboBox.SelectionChangeCommitted 事件,也许您需要删除设置为零的默认选定索引
将 DropDownStyle 属性 更改为 DropDownList。
默认值为 DropDown,在这种情况下,所选项目将由列表中第一个匹配的文本确定。 DropDown主要和自动补全逻辑结合使用
编辑:
如果您必须坚持使用 DropDown 样式,最好的解决方法是处理 DropDownClosed 事件,此时您将选择正确的索引。
我发现如果我在属性中将 FormattingEnabled 设置为 false,它会起作用。
我也遇到了同样的问题...对我来说最好的解决方案是将组合框的 DropDown 样式 属性 更改为 DropDownList。 当我需要 DropDown 样式时(例如,在组合框中输入新数据),我在代码中将 属性 更改为 DropDown...并在完成后改回 DropDownList。
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);
}