2011-08-31 67 views
1

我有下面的代碼,我試圖用來填充組合框,但它沒有顯示我添加的對象的實際文本。組合框不顯示文本

internal partial class SortBox : UserControl { 
    private Field[] FieldReferences 
    ... 
    internal Field[] Fields { 
     ... 
     set { 
      this.FieldReferences = value; 
      this.cboFields.Items.Clear(); 
      string NoneString = "(none)"; 
      this.cboFields.Items.Add(NoneString); 
      this.cboFields.SelectedItem = NoneString; 
      foreach (Field Field in this.FieldReferences) { 
       MessageBox.Show(Field.ToString()); // <- This displays what I want displayed perfectly. 
       this.cboFields.Items.Add(Field); 
      } 
     } 
    } 
    ... 
} 

public partial class Field : UserControl { 
    protected string LabelValue; 
    ... 
    public override string ToString() { 
     return this.LabelValue; 
    } 
} 

這是我得到的;他們都是空白:

Screenshot

我在做什麼錯?

編輯:顯然,我的Field類繼承自UserControl。我做了一些測試,它顯然與類繼承自System.ComponentModel.Component的事實有關。

回答

1

如果我讀你的代碼的權利,你想把一個用戶控件放在一個組合框中。

覆蓋toString將無法正常工作,當你這樣做,這樣做,你現在有工作的代碼,只需要改變DrawMode:

這工作:

cboFields.DrawMode = DrawMode.OwnerDrawFixed; 
cboFields.DrawItem += new DrawItemEventHandler(cboFields_DrawItem); 

private void cboFields_DrawItem(object sender, DrawItemEventArgs e) 
{ 
    e.DrawBackground(); 
    if (e.Index > -1) 
    e.Graphics.DrawString(cboFields.Items[e.Index].ToString(), e.Font, Brushes.Black, e.Bounds); 
} 

但我不得不比如說,我不知道將一個UserControl放在ComboBox集合中是否是最好的方法。我會認真考慮重構的不同。

+0

只是一些小問題:這將只在DropDownStyle是DropDownList(這正是我所需要的)時才起作用。否則,該列表將填充,但實際選定的項目將爲空白。此外,我用'新的SolidBrush(e.ForeColor)'代替'Brushes.Black'。你得到賞金。 –

0

添加到組合框的項目也應該是字符串,就像在消息框中一樣。

嘗試:this.cboFields.Items.Add(Field.ToString());

或者,你可以嘗試設置將DisplayMember領域,雖然的ToString應該已經默認:

this.cboFields.DisplayMember = "ToString()"

+0

該解決方案的問題是'this.cboFields.SelectedItem'將返回一個字符串而不是Field對象。這不起作用。 –

+1

Hmn,有趣。根據[here](http://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.items.aspx),只要您重寫ToString,就會顯示正確的文本,你已經按照代碼示例中的上一行完成了。嘗試設置[DisplayMember](http://msdn.microsoft.com/en-us/library/system.windows.forms.listcontrol.displaymember.aspx)? – Hannele

+0

「this.cboFields.SelectedItem將返回一個字符串...」=> Hannele建議正確的解決方案,並有一個字段類型,你應該創建一個新的Field實例; – ARZ