winforms - 仅检查一个ToolStripMenuItem

标签 winforms checked toolstrip toolstripdropdown toolstripitem

我有一个带有多个ToolStripToolStripDropDownButton,每个都有一套DropDownItems

当用户单击DropDownItem时,将显示复选标记。

默认情况下,可以单击多个项目,因此会出现多个复选标记。

我正在尝试做的是,当用户单击一个DropDownItem时,应取消选中其他已检查的项目。换句话说,在下拉列表中应该始终只有一个选中的项目。

我已经花了一段时间了,但是我真的无法弄清楚如何保留当前选中的项目,而取消选中其他项目。

下面是我到目前为止的代码。

private void subietm1ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            UncheckOtherToolStripMenuItems(sender);
        }

        public void UncheckOtherToolStripMenuItems(object selectedMenuItem)
        {
            List<ToolStripDropDownButton> dropdownButtons = new List<ToolStripDropDownButton>();
            foreach (ToolStripItem item in toolStrip1.Items)
            {
                if (item is ToolStripDropDownButton)
                {
                    dropdownButtons.Add((ToolStripDropDownButton)item);
                }
            }

            foreach (ToolStripDropDownButton btn in dropdownButtons)
            {
                foreach (ToolStripMenuItem d in btn.DropDownItems)
                {
                    if (d.Checked)
                        d.CheckState = CheckState.Unchecked;
                }
            }
        }

如果有人能对此有所启发或告诉我一种简单的解决方法,我将不胜感激。

谢谢你。

最佳答案

太简单...

实现如下所述的方法:

    private void subietm1ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        UncheckOtherToolStripMenuItems((ToolStripMenuItem)sender);
    }

    public void UncheckOtherToolStripMenuItems(ToolStripMenuItem selectedMenuItem)
    {
        selectedMenuItem.Checked = true;

        // Select the other MenuItens from the ParentMenu(OwnerItens) and unchecked this,
        // The current Linq Expression verify if the item is a real ToolStripMenuItem
        // and if the item is a another ToolStripMenuItem to uncheck this.
        foreach (var ltoolStripMenuItem in (from object 
                                                item in selectedMenuItem.Owner.Items 
                                            let ltoolStripMenuItem = item as ToolStripMenuItem 
                                            where ltoolStripMenuItem != null 
                                            where !item.Equals(selectedMenuItem) 
                                            select ltoolStripMenuItem))
            (ltoolStripMenuItem).Checked = false;

        // This line is optional, for show the mainMenu after click
        selectedMenuItem.Owner.Show();
    }

一个细节是,您可以为所有click menuItens实现相同的方法,为此在每个ToolstripMenuItem的事件单击中为方法UncheckOtherToolStripMenuItems((ToolStripMenuItem)sender);添加相同的调用,请参见此示例到另外两个ToolstripMenuItens:
    private void subietm2ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        UncheckOtherToolStripMenuItems((ToolStripMenuItem)sender);
    }

    private void subietm3ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        UncheckOtherToolStripMenuItems((ToolStripMenuItem)sender);
    }

关于winforms - 仅检查一个ToolStripMenuItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13603654/

相关文章:

c# - ToolStripManager 未恢复 Toolstrips 的位置

javascript - 单选按钮切换选中的 php

css - 如何使用 CSS 动态选择最后选中的复选框?

c# - 看不到消息框

vb.net - 如何解决幻像断点?

javascript - 如何使用javascript获取复选框的checked属性

c# - 为什么我的水平工具条一直垂直堆叠?

user-interface - 尝试将 ToolStrip 与现有 ToolStrip 并排添加到 ToolStripPanel

winforms - .net dottrace 内存分析使用问题 - 过滤循环引用

c# - 如何强制 DropDownList 样式的 ComboBox 仅在用户单击下拉按钮时打开?