下载ToolstripmenuItem上的项目并查看是否已选中其项目

时间:2008-11-28 09:41:54

标签: c# winforms visual-studio-2008

我正在建造一个小型Winform,我可以在厨房里查看食物类型。

我的整个库存可以通过数据网格视图显示。

现在,我有一个filtermenu,其中包含可以检查和取消选中的项目下拉列表。

根据检查该列表中的项目,更改datagridview中的显示。仅显示所选项目。

至少,这就是我想要的样子。 菜单目前有5个项目:肉类,鱼类,水果,蔬菜和其他。

我正在使用抽象类Food,所有其他类都是从它派生的。 最后,我为每件食物做了一个字符串表示,看起来有点像这样

食物类型* FoodName * AmountInStock * ...

所以明星*作为分隔符。

然后我这样做

foreach(Food f in this.kitchen.FoodList)
{
    string[] s = f.ToString().Split('*');
    Object o = filterMenu.DropDownItems[s[0]];
}

FoodList是一个ArrayList。 然后我用VisualStudio 2008调试它

Object o总是包含null。

然而s [0]总是包含食物类型的名称。 我想要的是能够找到检查该menulist上的项目。如果选中,则datagridview必须显示它。如果没有,请不要显示它。

我用构造函数填充它:

public static void Fill(ToolStripMenuItem item, Type food)
{
    foreach (string element in Enum.GetNames(food))
    {
        if (element != "nothing")
        {
            ToolStripMenuItem it = (ToolStripMenuItem)item.DropDownItems.Add(element);
            it.Checked = true;
            it.CheckOnClick = true;
        }
    }
}

我尝试过对象浏览器,但找不到任何有用的东西,所以我转到这里。

3 个答案:

答案 0 :(得分:0)

您在做什么时参考检查

filterMenu.DropDownItems [S [0]]。

您不能将s [0]的值与DropDownItems中的项匹配,但是您匹配它们的引用,并且它们不匹配。

您需要循环浏览所有项目并手动检查其是否相同,或者您找到了将自己的比较器插入该过程的方法。

答案 1 :(得分:0)

您可以使用IndexOfKey属性找回ToolStripMenuItem。这需要在添加时设置Name属性:

ToolStripMenuItem it = (ToolStripMenuItem)item.DropDownItems.Add(element);
it.Name = element;
// etc..

答案 2 :(得分:0)

当您从构造函数中填充MenuStrip时,添加了元素而没有给它们命名。然后您尝试按名称访问项目:

Object o = filterMenu.DropDownItems[s[0]]; //null  Name??

如果您添加元素并为其指定名称,则可以访问这些项目:

ToolStripMenuItem it = (ToolStripMenuItem)item.DropDownItems.Add(element);
it.Name = element;  // This was missing

基于OP问题我想要的是能够找出该menulist上的项目是否被检查。 此代码将显示如何查找已选中的菜单项:

filterMenu.DropDownItems.Cast<ToolStripMenuItem>().Where(tsi=>tsi.Checked).First().Text