如何从下拉框中设置所选值?

48

我在C# Windows窗体中使用了ComboBox控件。我按如下方式绑定了选项列表:

var employmentStatus = new BindingList<KeyValuePair<string, string>>();

employmentStatus.Add(new KeyValuePair<string, string>("0", "[Select Status]"));
employmentStatus.Add(new KeyValuePair<string, string>("1", "Contract"));
employmentStatus.Add(new KeyValuePair<string, string>("2", "Part Time"));
employmentStatus.Add(new KeyValuePair<string, string>("3", "Permanent"));
employmentStatus.Add(new KeyValuePair<string, string>("4", "Probation"));

employmentStatus.Add(new KeyValuePair<string, string>("5", "Other"));
cmbEmployeeStatus.DataSource = employmentStatus;
cmbEmployeeStatus.ValueMember = "Key";
cmbEmployeeStatus.DisplayMember = "Value";
cmbEmployeeStatus.SelectedIndex = 0;

我将选择的值保存在数据库中,例如1或2。现在我想从数据库项设置所选的值:

cmbEmployeeStatus.SelectedValue =employee.employmentstatus;     

但是下拉框没有选中值。我该如何做?


1
我使用了你的所有答案,但是组合框没有出现文本。我在form_Load中绑定了组合框。当我删除绑定时,文本出现在组合框中。为什么? - thinzar
我认为您分配为selectedItem的值不正确。我已在下面更新了我的答案。 - CharithJ
11个回答

61

试试这个。

cmbEmployeeStatus.SelectedIndex = cmbEmployeeStatus.FindString(employee.employmentstatus);

11
请注意,还有FindString可以返回以给定字符串开头的第一个元素,FindStringExact则执行精确的字符串匹配。 - til_b
1
为了更加安全,我倾向于使用“FindStringExact”。在这种情况下,“FindString”虽然有效,但可能会在列表中存在相似项的情况下出现问题。 - Broots Waymb

18
为了手动设置数据库风格的ComboBox,尝试建立内部数字和一些文本之间的关系,我发现你需要:
  1. 将项目存储在列表中(接近 - 除了字符串,字符串 - 需要int,字符串)
  2. 将DataSource属性设置为列表(不错)
  3. DataMember,DataValue(不错)
  4. 加载默认值(不错)
  5. 插入来自数据库的值(你的问题)
  6. 获取值以放回到数据库中(下一个问题)
首先,将你的KeyValuePair更改为所示:(0,“Select”)(1,“Option 1”)。 现在,当你运行sql“Select empstatus from employees where blah”并获得整数时,你需要快速设置combobox。 只需简单地使用SelectedVALUE而不是Item。
cmbEmployeeStatus.SelectedValue = 3;   //or

cmbEmployeeStatus.SelectedValue = intResultFromQuery;   

无论您是手动使用代码值加载combobox(就像您做的那样),还是从查询中加载combobox,本操作都将奏效。
如果您的外键是整数(对我所做的工作来说,它们都是整数),那么一切都很容易。用户更改comboBox后,您将在数据库中存储SelectedValue。(根据需要进行int转换)
以下是设置ComboBox为数据库值的代码:
if (t is DBInt) //Typical for ComboBox stuff
    {
    cb.SelectedValue = ((DBInt)t).value;
    }

要检索:

((DBInt)t).value = (int) cb.SelectedValue;

DBInt是一个整数的包装器,但它是我的ORM的一部分,可以让我手动控制数据绑定,并减少代码错误。

为什么我回答这个问题这么晚?因为我也在苦苦挣扎,似乎网上没有关于如何做到这一点的好信息。我想通了,觉得我应该友好地发布出来供其他人参考。


5
在Windows应用程序中,我们使用如下方式:
 DDLChangeImpact.SelectedIndex = DDLChangeImpact.FindStringExact(ds.Tables[0].Rows[0]["tmchgimp"].ToString());
 DDLRequestType.SelectedIndex = DDLRequestType.FindStringExact(ds.Tables[0].Rows[0]["rmtype"].ToString());

2
以下内容适用于您的情况。
cmbEmployeeStatus.SelectedItem =employee.employmentstatus;

当您将SelectedItem属性设置为对象时,ComboBox会尝试将该对象作为当前选定的对象显示在列表中。如果在列表中找到该对象,则它会显示在ComboBox的编辑部分,并且SelectedIndex属性将设置为相应的索引。如果该对象不存在于列表中,则SelectedIndex属性保持其当前值。
编辑: 我认为在您的情况下,以下设置选定项是不正确的。
cmbEmployeeStatus.SelectedItem =**employee.employmentstatus**;

像下面这样

var toBeSet = new KeyValuePair<string, string>("1", "Contract");
cmbEmployeeStatus.SelectedItem = toBeSet;

您应该分配正确的名称值对。


2
cmbEmployeeStatus.Text = "text"

2

在组合框中使用SelectedIndex属性来表示相应的员工状态。


1
一种可能的解决方案:

cmbEmployeeStatus.SelectedValue = cmbEmployeeStatus.Items.FindByText("text").Value;

1

我怀疑在保存到数据库时出了问题。我的理解是:

  1. 填充和绑定
  2. 用户选择一个项目,点击保存...然后你将其保存在数据库中
  3. 现在如果你选择另一个项目,它就不会被选中了?

有更多的代码吗,特别是在保存时?在你的代码中初始化和填充绑定列表的位置在哪里?


1
尝试这个。
combobox.SelectedIndex = BindingSource.Item(9) where "9 = colum name 9 from table"

0

试试这个:

KeyValuePair<string, string> pair = (KeyValuePair<string,string>)this.ComboBox.SelectedItem;

你必须尝试转换这个组合框。 因为C#在编译时是静态类型的,所以在变量声明后,除非该类型可以转换为变量的类型,否则不能重新声明变量或用于存储另一种类型的值。 - simi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接