大家都知道 .net 下的很多窗体控件如:ComboBox 等都具有数据绑定属性,现在有如下问题:comboBox.DataSource 已赋值为一个 ArrayList 数据源,comboBox 其 DisplayMember 及 ValueMember 属性均已赋相应值,为便于说明,其值大概用如下形式表示:DisplayMember ValueMember
BeiJing 01
TianJin 02
ShangHai 03由于其内部是自动绑定实现对应关系的,其从数据源中得到数据“01”会自动显示为“BeiJing”,但我现在需要在外部得到一个 ValueMember 值“01”时通过某种方式从 comboBox.DataSource 中取出该值对应的 DisplayMember 值“BeiJing”,或者实现反向寻找对应值,该怎么做呢?
BeiJing 01
TianJin 02
ShangHai 03由于其内部是自动绑定实现对应关系的,其从数据源中得到数据“01”会自动显示为“BeiJing”,但我现在需要在外部得到一个 ValueMember 值“01”时通过某种方式从 comboBox.DataSource 中取出该值对应的 DisplayMember 值“BeiJing”,或者实现反向寻找对应值,该怎么做呢?
for i=0 to ComboBox1.Items.Count-1
if ComboBox1.Items(i).value="01" then
'得到值
end if
Next
((DataRowView)this.comboBox_saler.SelectedItem)[1].ToString()为 ValueMember 的值
((DataRowView)this.comboBox_saler.SelectedItem)[0].ToString()为 ValueMember 的值
那麼你應該是這樣的:
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
{
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) : "";
}
还有你传入的参数 value 没有使用?
{
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 "";
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);
}