【问题标题】:Dropdown items on a ToolstripmenuItem and seeing if their items are checkedToolstripmenuItem 上的下拉项目并查看它们的项目是否被选中
【发布时间】:2008-11-28 09:41:54
【问题描述】:

我正在构建一个小型 Winform,我可以在其中查看厨房中的食物类型。

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

现在,我有一个过滤器菜单,其中包含可以选中和取消选中的项目的下拉列表。

根据该列表中的哪些项目被选中,datagridview 中的显示会发生变化。只显示被选中的项目。

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

我正在使用一个抽象类 Food,所有其他类都派生自它。 最终我为每块食物制作了一个字符串表示,看起来有点像这样

FoodType*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] 总是包含食物类型的名称。 我想要的是能够找出该菜单列表上的项目是否被选中。如果选中,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;
        }
    }
}

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

【问题讨论】:

    标签: c# winforms visual-studio-2008


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      你是在做参考检查

      filterMenu.DropDownItems[s[0]].

      您没有将 s[0] 的值与 DropDownItems 中的项目匹配,但您匹配它们的引用,而那些不匹配。

      您要么需要遍历所有项目并手动检查它们的是否相同,要么找到一种方法将自己的比较器插入该过程。

      【讨论】:

      • 嗯。由于我的 VS2008 中没有下拉控件,因此我无法真正对此进行测试。
      【解决方案3】:

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

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

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

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

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

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

      【讨论】:

      • 想详细说明为什么这应该是要走的路吗?
      • 同意,解释一下这个答案的作用,转储代码很少是个好主意。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 2015-10-02
      • 2016-04-01
      相关资源
      最近更新 更多