2011-04-21 62 views
8

誰能解釋這一點:重載的ToString(),並添加到列表框控件C#

public class Test : List<int> 
{ 
    public override string ToString() 
    { 
     return "My ToString"; 
    } 
} 

如果我實例化這一點,並把它添加到ListBox控制在Windows Form,它會顯示「收費」,而不是「我的ToString 」。

Test test = new Test(); 
listBox1.Items.Add(test); 

我以爲加入Items只會叫我類的ToString()。下面按預期工作當然

MessageBox.Show(test.ToString()); 

回答

7

對於工作,你必須禁用格式:

listBox1.FormattingEnabled = false; 

它看起來像如果啓用了格式化,它做了一些魔術,結果並不總是它應該是什麼?

+0

就是這樣。謝謝 – 2011-04-21 15:24:56

+0

使我的一天:-) – itsho 2011-10-16 20:48:16

+0

謝謝......愚蠢的魔術 – RustyH 2014-03-21 15:13:32

0

這豈不是得是這樣的:

listBox1.Items.Add(test.ToString()); 

我想你想你的列表框包含一個字符串類型?

不知道如果這是正確的,但我沒有測試過它。

+0

當然,這是有效的 - 但Add()接收一個對象,而不是它只是調用Object.ToString()這是虛擬的?如果我將我的類更改爲從Object繼承,它將起作用... – 2011-04-21 12:42:09

0

ListBox中的項目是對象的集合,而不是字符串。

MSDN: ListBox.ObjectCollection.Add Method

所以你要麼必須添加的實例作爲一個字符串(如:listBox1.Items.Add(test.ToString());)的前端或後端看列表框時,你必須調用toString(例如:listBox1.Items[0].ToString();) 。

+0

否 - 如果您是正確的,爲什麼向列表框中添加int工作?它調用Object中的虛擬ToString()方法。如果我鼓吹我的類從Object繼承它的作品以及... – 2011-04-21 12:44:46

4

將ListBox上的DisplayMember設置爲Test類型的屬性。

listBox1.DisplayMember = "Name"; 

要解決您的問題,請將名爲「Name」的屬性添加到Type中並在getter中調用ToString。

public class Test : List<Int32> 
{ 
    public String Name { get { return this.ToString(); } } 

    public override string ToString() 
    { 
     return "Test"; 
    } 
} 
+0

是的,我知道,以及...問題是爲什麼不是Listbox.items.add callign我的覆蓋toString()? – 2011-04-21 12:45:32

0

我也遇到過這個(還有另一個感謝Manji!)。 我有這樣的事情:

public override string ToString() 
    { 
     return MessageText; 
    } 

凡MessageText中是一個文本字段在幾其他之中,它工作得很好。後來我把它改爲這個

public override string ToString() 
    { 
     return string.Concat("[", MessageTime.ToString("yyyy-MM-dd HH:mm:ss.fffff"), "] ", MessageText); 
    } 

它仍然會返回只是MessageText字段內容(拉發時間)。有趣的是,我設置的ListBox上的上下文菜單將選定的項目複製到剪貼板,確實使用了完整的ToString覆蓋。

就我個人而言,我認爲FormattingEnabled屬性應該默認爲false而不是true,我發現我經常被IDE(或控制設置)抓住,試圖變得聰明。

///編輯:錯字(必須記住不要輸入肘部!