在发布此问题之前,我认为这是一个简单的问题,我搜索答案并找不到合适的解决方案。
在我的日常工作中,我正在使用Web应用程序,可以轻松获取或设置下拉列表的值
我不能在Windows应用程序C#
中做同样的事情我有组合框和类comboItem
public class ComboItem
{
public int Key { get; set; }
public string Value { get; set; }
public ComboItem(int key, string value)
{
Key = key; Value = value;
}
public override string ToString()
{
return Value;
}
}
假设组合框通过硬编码绑定,值为
Key:2 / Value:Female
Key:3 / Value:Unknown
假设我有Key = 3,我想通过代码设置此项(其键为3) 因此,当加载表单时,默认情况下所选的值将为“未知”。
combobox1.selectedValue =3 //Not Working , selectedValue used to return an object
combobox1.selectedIndex = 2 //Working as 2 is the index of key 3/Unknown
但是让我说我不知道索引,我怎样才能得到key = 3的项目的索引?
索引可以通过这种方式获得价值
int index = combobox1.FindString("Unknown") //will return 2
FindString取值而不是键,我需要像FindString那样取一个键并返回索引
注意: 这是我如何绑定我的下拉菜单
JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings();
jsonSerializerSettings.MissingMemberHandling = MissingMemberHandling.Ignore;
var empResult= await response.Content.ReadAsStringAsync();
List<Emp> Emps= JsonConvert.DeserializeObject<Emp[]>(empResult, jsonSerializerSettings).ToList();
foreach (var item in Emps)
{
ComboItem CI = new ComboItem(int.Parse(item.ID), item.Name);
combobox1.Items.Add(CI);
}
this.combobox1.DisplayMember = "Value";
this.combobox1.ValueMember = "Key";
答案 0 :(得分:5)
您需要设置ValueMember
属性,以便ComboBox
知道在使用SelectedValue
时要处理的属性。默认情况下,ValueMember
将为空。因此,当您设置SelectedValue
时,ComboBox
无法知道您要设置的内容。
this.comboBox1.ValueMember = "Key";
通常,您还需要设置DisplayMember
属性:
this.comboBox1.DisplayMember = "Value";
如果你没有设置它,它只会在对象上调用ToString()
并显示它。在您的情况下,ToString()
会返回Value
。
如何获得key = 3的项目索引?
如果您想要按键为3的项目,为什么需要从组合框中获取它?你可以从组合框绑定的集合中获取它:
例如,想象一下:
var items = new List<ComboItem> { new ComboItem(1, "One"),
new ComboItem( 2, "Two") };
this.comboBox1.DataSource = items;
this.comboBox1.DisplayMember = "Value";
this.comboBox1.ValueMember = "Key";
this.comboBox1.SelectedValue = 2;
如果我需要键为2的项目,那么这将实现:
// Use Single if you are not expecting a null
// Use Where if you are expecting many items
var itemWithKey2 = items.SingleOrDefault(x => x.Key == 2);