大家都知道 .net 下的很多窗体控件如:ComboBox 等都具有数据绑定属性,现在有如下问题:comboBox.DataSource 已赋值为一个 ArrayList 数据源,comboBox 其 DisplayMember 及 ValueMember 属性均已赋相应值,为便于说明,其值大概用如下形式表示:DisplayMember ValueMember
BeiJing 01
TianJin 02
ShangHai 03由于其内部是自动绑定实现对应关系的,其从数据源中得到数据“01”会自动显示为“BeiJing”,但我现在需要在外部得到一个 ValueMember 值“01”时通过某种方式从 comboBox.DataSource 中取出该值对应的 DisplayMember 值“BeiJing”,或者实现反向寻找对应值,该怎么做呢?

解决方案 »

  1.   

    循环啊,
    for i=0 to ComboBox1.Items.Count-1
    if ComboBox1.Items(i).value="01" then
    '得到值
    end if
    Next
      

  2.   

    不是循环的问题,comboBox.Items[i] 是一个 object 类型,它本身并不具有 value 属性,我不知道你是怎么点出来的!
      

  3.   

    ((DataRowView)this.comboBox_saler.SelectedItem)[1].ToString()为 DisplayMember 的值
    ((DataRowView)this.comboBox_saler.SelectedItem)[1].ToString()为 ValueMember 的值
      

  4.   

    ((DataRowView)this.comboBox_saler.SelectedItem)[1].ToString()为 DisplayMember 的值
    ((DataRowView)this.comboBox_saler.SelectedItem)[0].ToString()为 ValueMember 的值
      

  5.   

    楼上的兄弟,前提是我在对 comboBox1 赋数据源及相应属性后并没有执行任何用户操作,当然不会有 SelectedItem ,可以理解为此时 comboBox1 只相当于一个数据源,我得到的“01”value 值可能来自 一个 textBox 的用户输入,从而要得到 comboBox1 数据源中该值对应的 Display 值“BeiJing”。我想这下说清楚了……
      

  6.   

    假若你的combox1 的數據源是idtb_temp ,是一個datatable
    那麼你應該是這樣的:
            Me.ComboBox1.DataSource = idtb_temp
            Me.ComboBox1.DisplayMember = "DisplayMember"
            Me.ComboBox1.ValueMember = "ValueMember"你想通過valuemember 來得到displaymember 的顯示...
    那麼你可以這樣做:(這裡的textbox2.text 是你輸入的valuemember的值)       For i As Integer = 0 To Me.ComboBox1.Items.Count - 1
                If Me.idtb_temp.Rows(i).Item("ValueMember") = Me.TextBox2.Text Then
                    Me.ComboBox1.Text = idtb_temp.Rows(i).Item("DisplayMember")
                End If        Next
      

  7.   

    之所以前面我说明绑定的数据源是 ArrayList ,就是不想大家以 DataTable 的思路去考虑这个问题,因为现在来说只是得到了一个已绑定数据源并设置了 DisplayMember 及 ValueMember 属性的 comboBox 对象,所有的操作都是基于这个 comboBox 对象的,所以不能确定其真正绑定了哪个数据源,也就是说不能直接针对那个真正的数据源进行操作。最初我以为设置以上属性之后的 comboBox1.Items 中只存在其 DisplayMember 的集合,但在程序 Debug 时,监视 comboBox1.Items 属性,我发现其中每个 item 中都可以看到相应的 DisplayMember 及 ValueMember 值,那么问题是如何才能通过代码将这个值取出来呢?
      

  8.   

    继承ComboBox并添加下面的方法:public string LookupDisplayText(object value) 
    {
    PropertyDescriptorCollection props = this.DataManager.GetItemProperties();
    BindingMemberInfo valueBindingMember = new BindingMemberInfo(ValueMember);
    PropertyDescriptor valueMemberProperty = props.Find(valueBindingMember.BindingField, true);BindingMemberInfo displayBindingMember = new BindingMemberInfo(DisplayMember);
    PropertyDescriptor displayMemberProperty = props.Find(displayBindingMember.BindingField, true);object displayItem = null;
    if (displayMemberProperty != null) 
    {
    displayItem = displayMemberProperty.GetValue(valueRow);

    else 
    {
    displayItem = valueRow;
    }return (displayItem != null) ? Convert.ToString(displayItem, CultureInfo.CurrentCulture) : "";
    }
      

  9.   

    感谢“langmafeng(乞力马扎罗) ”,有点儿疑问:你上面的 valueRow 是什么值?
    还有你传入的参数 value 没有使用?
      

  10.   

    不好意思,漏了一行和一个方法:private object RowObjectFromComboBoxDataSource(PropertyDescriptor property, Object key) 
    {
    if (key == null) throw new ArgumentNullException("Bad Key"); CurrencyManager cm = this.DataManager;
    if (cm == null) throw new ArgumentNullException("Bad ComboBox CurrencyManager"); //If the data source is a bindinglist use that as its probably more efficient
    if (property != null && (cm.List is IBindingList) && ((IBindingList)cm.List).SupportsSearching) 
    {
    int index = ((IBindingList)cm.List).Find(property, key);
    return cm.List[index];
    } //Otherwise walk across the rows looking for the row we want 
    for (int i = 0; i < cm.List.Count; i++) 
    {
    object row = cm.List[i];
    object value = property.GetValue(row);
    if (key.Equals(value))  return row;
    } return null;
    }在刚才那个方法里加上:
    object valueRow = this.RowObjectFromComboBoxDataSource(valueMemberProperty, value);
    if (valueRow == null) return "";
      

  11.   

    不知道为什么,我的程序执行到 LookupDisplayText(object value) 方法中的第一行:PropertyDescriptorCollection props = this.DataManager.GetItemProperties();时就报异常,“未将对象引用设置到对象的实例。”
      

  12.   

    调用此方法之前要设置 DataSource,最好在此之前加个判断,判断DataManager是否为null
      

  13.   

    调用之前我已经设置了 DataSource ,刚才跟了一下,到这里时,DataSource 有值,但 DataManager 为<为定义的值>。???
      

  14.   

    Microsoft 的文档中说:“如果设置了 DataSource 属性,则 DataManager 属性有效。”但我里怎么 this.DataSource 有真实数据,this.DataManager 却为<为定义的值> ???头疼!!!
      

  15.   

    上面写错了,是 <未定义的值>
      

  16.   

    try
    ComboBox cb = ...; string sID = "id1"; foreach (Object o in cb.Items)
    {

    System.Reflection.PropertyInfo piValue = o.GetType().GetProperty(cb.ValueMember );
    System.Reflection.PropertyInfo piDisplay = o.GetType().GetProperty(cb.DisplayMember );

    string sValue = piValue.GetValue(o,null).ToString();
    string sDisplay = piDisplay.GetValue(o,null).ToString();
    if (sValue == sID)
    MessageBox.Show(sDisplay); //or

    YourClass yc = (YourClass)o;
    if (yc.Property1 == sID)
    MessageBox.Show(yc.Property2);
    }
      

  17.   

    感谢“saucer(思归) ”和“langmafeng(乞力马扎罗)”给了我正确的思路,我的问题已得到解决,谢谢你们!