2011-08-05 49 views
4

请考虑以下几点:如何获取组合框的DrawItem事件中的DisplayMember值? C#

我使用下面的方法来填充我的组合框:

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情况下,我想获得DisplayMember(名称)的值的组合框,并为其分配到一些变量。 到目前为止,我得到了这个代码,它似乎不工作...请纠正它。在此先感谢....

void comboBox1_DrawItem(object sender, DrawItemEventArgs e) 
{ 
    string name = ((System.Data.DataRowView)(comboBox1.SelectedValue = e.Index))["name"].ToString(); 

    // do something 
    // 
} 

回答

1

怎么样只用组合框项目,它被选中的显示值:

string name = (string)comboBox1.Items[e.Index]; 

如果你得到e.Index = -1,改变DrawMode = OwnerDrawVariableDropDownStyle = DropDown

编辑:

好吧我明白最新的错误。我用字符串作为数据源测试,所以在你的代码应该工作的:

string name = ((DataRowView)comboBox1.Items[e.Index])["name"]; 
+0

确定对象指定的成员的字符串值,试图...... – yonan2236

+0

不工作.. ... – yonan2236

+0

@ yonan2236看编辑答案 – Reniuz

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); 

}

9

好吧,我只是碰到这种问题就来了我这里是一个更好的答案:

string displayValue = this.GetItemText(this.Items[e.Index]);    
g.DrawString(displayValue, e.Font, br, e.Bounds.Left, y + 1); 

每MSDN:

如果未指定DisplayMember属性,则返回值为 GetItemTex t是该项目的ToString方法的值。否则, 方法返回 DisplayMember属性在项参数中指定

http://msdn.microsoft.com/en-us/library/system.windows.forms.listcontrol.getitemtext(v=vs.80).aspx