Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何按键从组合框中选择项目?_C#_Winforms_Combobox_Key - Fatal编程技术网

C# 如何按键从组合框中选择项目?

C# 如何按键从组合框中选择项目?,c#,winforms,combobox,key,C#,Winforms,Combobox,Key,我填充从数据库获取数据的组合框 getAllNames() { string sql = "SELECT * FROM names"; } 这是我的数据库结构: Table names ID ------ Name 1 ------ John 2 ------ Sarah 3 ------ Peter 这是我的班级结构 // Class structure public class Names { public int id;

我填充从数据库获取数据的组合框

getAllNames()
{
    string sql = "SELECT * FROM names";
}
这是我的数据库结构:

Table names

ID ------ Name

1  ------ John
2  ------ Sarah
3  ------ Peter

这是我的班级结构

// Class structure

    public class Names
    {
        public int id;
        public string name;
    }
这就是我如何声明我的字典和如何设置它

// Declare dictionary
Dictionary<int, string> dataSouceNames;

public MyProgram()
{
    InitializeComponent();
    dataSouceNames = getComboDataSourceNames();
}

最后,我如何填写我的组合框

// Function fill combobox
private void initComboNames()
{
    cmbNames.DataSource = new BindingSource(dataSourceNames, null);
    cmbNames.DisplayMember = "Text";
    cmbNames.ValueMember = "Value";
}

然后我尝试按键选择组合框中的项目:

    cmbNames.SelectedItem = Names.ID // WHERE Names.ID is number "2"

我希望输出“Sarah”作为SelectedIndex,但我知道我做错了。

我认为您必须传递名称(“Sarah”而不是Id“2”),如果不可能,请使用SelectedValue

cmbNames.SelectedValue = Names.Id;
否则,如果您知道索引,则可以执行此操作

cmbNames.SelectedIndex= 1;

首先,用这种方式填充组合框。这样,组合框将向用户显示名称(显示成员),但当您选择索引时,它将为您提供ID(值成员)

当您完成此操作后,您只需通过

int id =  comboBox.SelectedValue;

还记得comboboc、columnId等字段与desire字段的更改吗?为什么我建议使用这种赋值来设置ComboBox的当前项:

cmbNames.SelectedItem = new KeyValuePair<int, string>(Names.ID, dataSouceCantieri[Names.ID]);
它与设置
[ComboBox]时发生的情况有关
事实上,你不能那样做。字典是一个复杂的对象,它不是由控件的
数据源
属性直接管理的;它只接受实现或的复杂对象。字典不会

当然,您可以将字典转换为列表,它现在将被接受:

[ComboBox].DataSource = [Dictionary<TKey, TValue>].ToList();
实际上,我们将控件的数据源设置为IList

因此,每个
组合框.项
都是一个
键值对

这里有一个
KeyValuePair

这就是为什么我们可以设置:

[ComboBox].DisplayMember = "Value";
[ComboBox].ValueMember = "Key";
这些是
KeyValuePair
类公开的属性的名称

由于组合框的每个项目都是一个
KeyValuePair
,要选择一个项目,使其成为当前项目,我们可以将其设置为特定的
KeyValuePair

在您的情况下,密钥由
Names.ID
属性提供:

cmbNames.SelectedItem = new KeyValuePair<int, string>(Names.ID, dataSouceCantieri[Names.ID]);

或类似的。此方法意味着迭代集合,直到找到正确的元素或未找到任何元素

不幸的是,我没有索引,也不能传递名称“Sarah”,因为在我的数据库中,我将值保存为数字…你能试试看->cmbNames.SelectedValue=Names.Id;更新了以上答案。数据源是什么<代码>数据源名称
数据源名称
?如果是
dataSouceCantieri
,则
cmbNames.SelectedItem=newkeyvaluepair(Names.ID,dataSouceCantieri[Names.ID])。您应该有
.DisplayMember=“Value”
(对应于字符串,
名称)和
.ValueMember=“Key”
<代码>数据源名称
未声明且未确定。您好@Jimi您的解决方案有效,同时我不明白您做了什么!我读到这不是聊天,但如果你能解释一下我写的东西,那就太酷了。谢谢你,你就是那个人!这是你能做的最好的解释,在微软文档中我也找不到类似的解释!我想捐赠
[ComboBox].DataSource = [Dictionary<TKey, TValue>].ToList();
cmbNames.DataSource = new BindingSource(dataSourceNames, null);
[ComboBox].DisplayMember = "Value";
[ComboBox].ValueMember = "Key";
cmbNames.SelectedItem = new KeyValuePair<int, string>(Names.ID, dataSouceCantieri[Names.ID]);
cmbNames.SelectedItem = dataSouceCantieri.FirstOrDefault(dict => dict.Key == Names.ID);