2011-09-04 149 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我在慢速移动连接的火车上匆忙地打字。感谢您发布更完整的答案。 –