我正在建造一个小型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;
}
}
}
我尝试过对象浏览器,但找不到任何有用的东西,所以我转到这里。
答案 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