2011-09-04 137 views
4
private SortedList<ToolStripMenuItem, Form> forms = new SortedList<ToolStripMenuItem, Form>();     

private void MainForm_Load(object sender, EventArgs e) 
{ 
    formsAdd(menuCommandPrompt, new CommandPrompt()); 
    formsAdd(menuLogScreen, new LogScreen()); //Error 
} 

private void formsAdd(ToolStripMenuItem item, Form form) 
{ 
    forms.Add(item, form); //Failed to compare two elements in the array. 
    form.Tag = this; 
    form.Owner = this; 
} 

我無法理解它爲什麼會拋出錯誤。表單加載事件的第二行發生錯誤。無法比較陣列中的兩個元素

formsAdd方法只是簡單地將form和toolstip元素添加到數組(表單),並將標記和窗體所有者設置爲此。在第二次調用函數時,它會引發錯誤。

CommandPrompt, LogScreen /* are */ Form //s 
menuCommandPrompt, menuLogScreen /* are */ ToolStripMenuItem //s 

Error

+0

請例外詳細。它看起來像你創建了一個ToolStripMenuItem的排序列表,但沒有提供一種方法來比較它們,這使排序變得困難。 –

回答

10

你有一個SortedList,但ToolStripMenuItem沒有實現IComparable,因此列表不知道如何對它們進行排序。

如果您不需要對項目進行排序,則可以使用Tuple s或Dictionary的列表,具體取決於您想要執行的操作。

如果您想讓它們排序,您需要使用the overload of SortedLists's constructor,它需要IComparer。這意味着你必須以某種方式實現該接口。

+0

看來我有很多工作要做..爲什麼我使用這種方法是我簡單地創建了一個函數來實現我所有的ToolStripMenuItem的點擊事件。我得到發件人的東西,然後打開與MenuItem相關的表單。 – haxxoromer

+0

使用'Dictionary'可能是最好的選擇。 – svick

+0

出於某種原因,我必須通過索引的值獲取SortedList的索引。在目錄中是不可能的。 (這樣想) – haxxoromer

2

兩種對象類型都實現了IComparable嗎?這是排序列表的必須條件,用於比較它添加到數組中的對象。

+0

我不知道IComparable的東西...... = D而不知道我將如何處理這些東西。 – haxxoromer

+0

只有重要對象需要實現'IComparable'。問題指出,關鍵是['ToolStripMenuItem'](http://msdn.microsoft.com/en-us/library/system.windows.forms.toolstripmenuitem.aspx),它沒有實現它。 – svick

+0

@svick yea我在慢速移動連接的火車上匆忙地打字。感謝您發佈更完整的答案。 –