9

私はToolStrip複数ToolStripDropDownButtonのsを持っており、それぞれにのセットがありDropDownItemsます。

ユーザーがDropDownItemをクリックすると、チェックマークが表示されます。

ここに画像の説明を入力してください

デフォルトでは、複数のアイテムをクリックできるため、複数のチェックマークが表示されます。

ここに画像の説明を入力してください

私がやろうとしているのは、ユーザーが1つのDropDownItemをクリックしたときに、他のすでにチェックされているアイテムのチェックを外す必要があるということです。つまり、ドロップダウンリストには常に1つのチェック項目のみが存在する必要があります。

しばらく手を出していましたが、他のチェックを外している間、現在チェックしているアイテムをそのままにしておく方法がよくわかりません。

以下は私が今持っているコードです。

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;
                }
            }
        }

誰かがこれに光を当てたり、簡単な方法を教えてくれたら、ありがたいです。

ありがとうございました。

4

5 に答える 5

16

とても簡単...

以下に説明するように、それらのメソッドを実装します。

    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();
    }

1つの詳細は、すべてのクリックmenuItensに同じメソッドを実装できることです。これによりUncheckOtherToolStripMenuItems((ToolStripMenuItem)sender);、各ToolstripMenuItemのイベントクリックに同じメソッドの呼び出しを追加します。別の2つのToolstripMenuItensのこの例を参照してください。

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

    private void subietm3ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        UncheckOtherToolStripMenuItems((ToolStripMenuItem)sender);
    }
于 2012-11-28T11:51:38.670 に答える
3

item_Clickのイベントを使用してメニュー内のすべてのアイテムを設定したので、1つがクリックされると、以下のコードが実行されます。そのようにボタンごとにイベントは必要ありません。

    private void item_Click(object sender, EventArgs e)
    {
        // Set the current clicked item to item
        ToolStripMenuItem item = sender as ToolStripMenuItem;
        // Loop through all items in the subMenu and uncheck them but do check the clicked item
        foreach (ToolStripMenuItem tempItemp in (ToolStripMenuItem)item.OwnerItem.DropDownItems)
        {
            if (tempItemp == item)
                tempItemp.Checked = true;
            else
                tempItemp.Checked = false;
        }
    }

実行時にリストに複数のアイテムを追加し、それらを上記の方法で接続する場合は、以下のコードを実行できます。

    private void subItemsMenus(ToolStripMenuItem parentItem, string[] listItems)
    {
        // Clear tool strip items first
        parentItem.DropDownItems.Clear();
        // Add items that are in the list
        foreach (string subMenuItem in listItems)
        {
            ToolStripMenuItem item = new ToolStripMenuItem();
            //Name that will appear on the menu
            item.Text = subMenuItem; 
            //Put in the Name property whatever necessary to retrieve your data on click event
            item.Name = subMenuItem;
            //On-Click event
            item.Click += new EventHandler(item_Click);
            //Add the submenu to the parent menu
            parentItem.DropDownItems.Add(item);
        }
于 2014-09-12T04:58:15.587 に答える
1

私には別の方法があります:

各アイテムはに移動しToolStripMenuItem_CheckStateChanged(object sender, EventArgs e) 、すべてのアイテムには独自のタグがあり1, 2, 3, 4, 5ます。1つのアイテムが開始時にチェックされ、がありますtag = 1

    int selecteditem = 1;
    bool atwork = false;
    private void dzienToolStripMenuItem_CheckStateChanged(object sender, EventArgs e)
    {
        if (atwork) return;
        else atwork = true;

        selecteditem = Convert.ToInt32(((ToolStripMenuItem)sender).Tag);

        foreach (ToolStripMenuItem it in sometooltipdropdown.DropDownItems)
        {
            if (Convert.ToInt32(it.Tag) != selecteditem)
            {
                it.Checked = false;
            }                
        }

        atwork = false;
    }
于 2017-03-11T21:52:48.930 に答える
1

最も簡単な方法は、 DropDownItemClickedイベントを追加し、独自のメソッドを作成することです。

private void toolStripDropDownButton1_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
    {
        if (e.ClickedItem != null)
        {
            CheckSelected((ToolStripDropDownButton)sender, e.ClickedItem);
        }
    }

    private void CheckSelected(ToolStripDropDownButton button, ToolStripItem selectedItem)
    {
        foreach (ToolStripMenuItem item in button.DropDownItems)
        {
            item.Checked = (item.Name == selectedItem.Name) ? true : false;
        }
    }
于 2020-04-17T08:10:47.550 に答える
0

配列にコピーしてから拡張機能を使用することで、カウントを取得できます。

ToolStripItem[] controls = new ToolStripItem[ToolStrip.DropDownItems.Count];
ToolStrip.DropDownItems.CopyTo(controls,0);
intcheckCount = controls.Count(c => (c as ToolStripMenuItem).Checked);

if (checkCount == 0) // must keep 1 selection
     item.Checked = true;
else if (checkCount > 1)  //uncheck all others
     controls.Cast<ToolStripMenuItem>().Where(c => c.Checked && c.Name != item.Name)
       .ToList().ForEach(s => s.Checked = false);
于 2014-12-17T23:08:27.340 に答える