只在menuStrip中选中一个复选框

时间:2015-09-27 17:27:08

标签: c# winforms checkbox menu

我有一个带复选框的菜单(例如,设置>使用HTTP / HTTPS / SOCKS5 - 3个不同的复选框),我想这样做,以便当选中一个复选框时,其他复选框将自动取消选择。

我的想法是使用某种循环来遍历每个元素并取消选择它们,除了所选元素。

我试过这样:

foreach (ToolStripItem mi in settingsToolStripMenuItem)
            {
                  // code to unselect here
            }

但我无法弄清楚。

2 个答案:

答案 0 :(得分:1)

在子菜单的点击事件处理程序中,您可以取消选中所有项目并仅检查点击的项目:

private void SubMenu_Click(object sender, EventArgs e)
{
    var currentItem = sender as ToolStripMenuItem;
    if (currentItem != null)
    {
        //Here we look at owner of currentItem
        //And get all children of it, if the child is ToolStripMenuItem
        //So we don't get for example a separator
        //Then uncheck all

        ((ToolStripMenuItem)currentItem.OwnerItem).DropDownItems
            .OfType<ToolStripMenuItem>().ToList()
            .ForEach(item =>
            {
                item.Checked = false;
            });

        //Check the current items
        currentItem.Checked = true;
    }
}

备注:

  • 您可以对所有子菜单使用相同的代码,或将其放在一个始终确保仅检查一个项目的函数中,并在每个子菜单单击处理程序中调用该函数。
  • 我使用((ToolStripMenuItem)currentItem.OwnerItem)查找所点击项目的所有者,以便在您需要此类功能的每种情况下都可以重复使用。

如果您的班级使用中没有using System.Linq;,请添加它。

答案 1 :(得分:0)

如果您的复选框位于ToolStripControlHost中, 您可以在复选框的CheckedChanged事件中执行此操作:

foreach (ToolStripItem mi in settingsToolStrip.Items) {
    ToolStripControlHost item = mi as ToolStripControlHost; 
    if (item != null) {
        if (item.Control is CheckBox) {
            // put your code here that checks all but the one that was clicked.
            ((CheckBox)item.Control).Checked = false;
        }
    }
}