请考虑以下事项:
我使用以下方法填充我的comboBox:
void populateComboBox()
{
comboBox1.DataSource = GetDataTableSource(); // some data table used as source
comboBox1.DisplayMember = "name"; // string
comboBox1.ValueMember = "id"; // id is an int
// Suppose I have this data in my comboBox after populating it
//
//
// id (ValueMember) | name (DisplayMember)
// -----------------------------------------
// 1 | name1
// 2 | name2
// 3 | name3
}
在DrawItem
事件中,我想获取comboBox的DisplayMember
(名称)的值并将其分配给某个变量。
到目前为止,我得到了这个代码,似乎没有工作......请纠正。提前谢谢....
void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
string name = ((System.Data.DataRowView)(comboBox1.SelectedValue = e.Index))["name"].ToString();
// do something
//
}
答案 0 :(得分:14)
好的,我刚刚遇到了这个问题,这是一个更好的答案:
string displayValue = this.GetItemText(this.Items[e.Index]);
g.DrawString(displayValue, e.Font, br, e.Bounds.Left, y + 1);
每个MSDN:
如果未指定DisplayMember属性,则返回的值 GetItemText是项的ToString方法的值。否则, method返回在中指定的成员的字符串值 item参数
中指定的对象的DisplayMember属性
http://msdn.microsoft.com/en-us/library/system.windows.forms.listcontrol.getitemtext(v=vs.80).aspx
答案 1 :(得分:1)
如何仅使用组合框项目,选择显示值:
string name = (string)comboBox1.Items[e.Index];
如果您获得e.Index = -1
,请更改DrawMode = OwnerDrawVariable
和DropDownStyle = DropDown
修改强>
好的我明白了什么不对。我使用字符串作为数据源进行测试,因此在您的代码中应该这样做:
string name = ((DataRowView)comboBox1.Items[e.Index])["name"];
答案 2 :(得分:1)
如果你想制作一个非常通用的功能,你可以详细说明一下:
假设您有两个组合框,一个包含基于自定义集合A和DisplayMember AA的项目,另一个包含基于自定义集合B和DisplayMember BB的项目:
泛型函数如何知道返回哪个值?当然,基于DisplayMember,但是如果你想要它是通用的,你不想将AA / BB传递给泛型函数。
所以
[anItemTheCombobox.GetType().GetProperty(theCombobox.DisplayMember).GetValue(theCombobox, null)];
背景
我在名为calculateAndSetWidth的泛型函数中使用它。该函数循环遍历列表框中的所有项以确定maxWidth:
public void calculateAndSetWidth(ListBox listbox, int minWidth = 0) {
Graphics graphics = this.CreateGraphics();
int maxWidth = 0;
SizeF mySize = null;
foreach (object item in listbox.Items) {
mySize = graphics.MeasureString(item.GetType().GetProperty(listbox.DisplayMember).GetValue(item, null), listbox.Font);
if (mySize.Width > maxWidth) {
maxWidth = mySize.Width;
}
}
listbox.Width = Math.Max(maxWidth, minWidth);
}