如何在comboBox的DrawItem事件中获取DisplayMember值? C#

时间:2011-08-05 10:21:40

标签: c# winforms

请考虑以下事项:

我使用以下方法填充我的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
    //  
}

3 个答案:

答案 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 = OwnerDrawVariableDropDownStyle = 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);

}