2017-06-04 33 views
0

在发布此问题之前,我认为这是一个简单的问题,我搜索答案并没有找到合适的解决方案。设置ComboBox按键不是按值选择项c#

在我的日常工作

,我与Web应用程序的工作,并可以很容易地获取或设置

我不能做相同的Windows应用程序C#dropdownlists值

我有组合框和阶级的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; 
     } 
    } 

说该组合框是通过硬编码绑定和的值是

  • 重点:1 /值:男性
  • 键:2 /价值:女

  • 键:3 /值:未知

可以说,我有钥匙= 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 

但让我说我不知道​​索引,我怎么得到的项目的索引,其中的关键= 3?

指数可在这样

int index = combobox1.FindString("Unknown") //will return 2 

查找字符串取一个值不是关键,通过价值的东西,我需要像查找字符串内搭键和返回指数

注: 这里是如何我结合我的下拉菜单

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

Windows Forms? WPF?要么 ? –

+0

Windows窗体C# – Bassem

回答

2

您需要设置ValueMember属性,以便在ComboBox知道什么财产处理当SelectedValue正在使用。默认情况下,ValueMember将为空。所以当你设置SelectedValue时,ComboBox不知道你想要设置什么。

this.comboBox1.ValueMember = "Key"; 

通常情况下,你也将设置DisplayMember属性:

this.comboBox1.DisplayMember = "Value"; 

如果不设置它,它只会调用对象ToString()和显示。在你的情况下,ToString()返回Value

我怎样才能得到其索引项的关键= 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); 
+0

非常感谢@CodingYoshi和非常好的信息,为什么我需要从组合框中获取它的原因是我试图在不同的位置/功能获取它,而不是它绑定的位置,你有什么想法吗? – Bassem

+0

我试过这个comboSubscriptionType.SelectedValue = 12,并且在调试这一行之后,SelectedValue仍然为null,我添加了comboBox1.DisplayMember =“Value”; comboBox1.ValueMember =“Key”; 在我绑定的地方 – Bassem

+0

你有一个项目与关键12?要回答您之前的评论,您始终可以将对数据源的引用存储为类级别字段。或者你可以像这样从组合框中投射它:'(列表)this.comboBox1.DataSource' – CodingYoshi