如何从组合框中设置选定的值?
Posted
技术标签:
【中文标题】如何从组合框中设置选定的值?【英文标题】:How to set selected value from Combobox? 【发布时间】:2011-10-05 00:20:09 【问题描述】:我在 c# windows 窗体中使用组合框。我将项目列表绑定如下:
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;
但是组合框没有被选中。我该怎么做?
【问题讨论】:
我使用了你所有的答案,但组合框没有与文本一起出现。我在 form_Load 中绑定了组合框。我删除了文本出现在组合框中的绑定。为什么? 我认为您分配为 selectedItem 的值不正确。我在下面更新了我的答案。 【参考方案1】:试试这个
combobox.SelectedIndex = BindingSource.Item(9) where "9 = colum name 9 from table"
【讨论】:
【参考方案2】:试试这个:
KeyValuePair<string, string> pair = (KeyValuePair<string,string>)this.ComboBox.SelectedItem;
【讨论】:
您必须尝试强制转换此组合框因为 C# 在编译时是静态类型的,所以在声明变量后,它不能再次声明或用于存储另一种类型的值,除非该类型可转换为变量的类型。【参考方案3】:一个可能的解决方案:
cmbEmployeeStatus.SelectedValue = cmbEmployeeStatus.Items.FindByText("text").Value;
【讨论】:
【参考方案4】:为了手动设置数据库样式 ComboBoxes 尝试设置数字(内部)和某些文本(可见)之间的关系,我发现您必须:
-
将您的项目存储在一个列表中(您很接近 - 除了字符串、字符串 - 需要 int、字符串)
DataSource 属性到列表(你很好)
DataMember,DataValue(你很好)
加载默认值(你很好)
从数据库中输入值(您的问题)
获取值以放回数据库(您的下一个问题)
首先要做的事情。将您的 KeyValuePair 更改为如下所示:
(0,"选择") (1,"选项 1")
现在,当您运行 sql“Select empstatus from employees where blah”并返回一个整数时,您需要设置组合框而不浪费大量时间。
简单地说:*** SelectedVALUE - 不是项目****
cmbEmployeeStatus.SelectedValue = 3; //or
cmbEmployeeStatus.SelectedValue = intResultFromQuery;
无论您是否像以前那样手动加载了带有代码值的组合框,或者如果您从查询中加载组合框,这都将起作用。
如果你的外键是整数,(对我来说,它们都是整数),生活很容易。用户对组合框进行更改后,您将存储在数据库中的值是 SelectedValue。 (根据需要转换为 int。)
这是我将 ComboBox 设置为数据库值的代码:
if (t is DBInt) //Typical for ComboBox stuff
cb.SelectedValue = ((DBInt)t).value;
然后检索:
((DBInt)t).value = (int) cb.SelectedValue;
DBInt 是 Integer 的包装器,但这是我的 ORM 的一部分,可让我手动控制数据绑定,并减少代码错误。
为什么我这么晚才回答这个问题?我也在为此苦苦挣扎,因为网上似乎没有关于如何做到这一点的好信息。我想通了,并认为我会很好并将其发布给其他人看。
【讨论】:
【参考方案5】:cmbEmployeeStatus.Text = "text"
【讨论】:
【参考方案6】:在 windows 应用程序中 我们这样使用
DDLChangeImpact.SelectedIndex = DDLChangeImpact.FindStringExact(ds.Tables[0].Rows[0]["tmchgimp"].ToString());
DDLRequestType.SelectedIndex = DDLRequestType.FindStringExact(ds.Tables[0].Rows[0]["rmtype"].ToString());
【讨论】:
【参考方案7】:以下内容适用于您的情况。
cmbEmployeeStatus.SelectedItem =employee.employmentstatus;
当您将 SelectedItem 属性设置为一个对象时,ComboBox 会尝试使该对象成为列表中当前选定的对象。如果在列表中找到该对象,它将显示在 ComboBox 的编辑部分,并且 SelectedIndex 属性设置为相应的索引。如果列表中不存在该对象,则 SelectedIndex 属性将保留其当前值。
编辑
我认为在您的情况下将 Selected Item 设置如下是不正确的。
cmbEmployeeStatus.SelectedItem =**employee.employmentstatus**;
如下图
var toBeSet = new KeyValuePair<string, string>("1", "Contract");
cmbEmployeeStatus.SelectedItem = toBeSet;
您应该分配正确的名称值对。
【讨论】:
【参考方案8】:我怀疑当您保存到数据库时有些地方不对劲。我是否将您的步骤理解为:
-
填充和绑定
用户选择和项目,点击并保存..然后你保存在数据库中
现在如果您选择其他项目,它不会选择?
获得更多代码,尤其是在保存时?在您的代码中初始化和填充绑定列表的位置
【讨论】:
【参考方案9】:将 SelectedIndex 属性用于组合框中的相应员工状态。
【讨论】:
【参考方案10】:在组合框中设置值
cmbEmployeeStatus.Text="Something";
【讨论】:
【参考方案11】:试试这个。
cmbEmployeeStatus.SelectedIndex = cmbEmployeeStatus.FindString(employee.employmentstatus);
希望对您有所帮助。 :)
【讨论】:
请记住,FindString 会返回以给定字符串开头的第一个元素,而 FindStringExact 会执行精确的字符串匹配。 为了安全起见,我更倾向于FindStringExact
。 FindString
在这种情况下有效,但在列表包含类似项目的情况下可能会中断。以上是关于如何从组合框中设置选定的值?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Access 2007 中设置第一个连续组合框不可见?
WPF DataGrid - 从 DataGrid ItemsSource 对象的集合值中设置唯一的每行(对象)组合框值