2

これは可能ですか?

サブメニュー項目を含む10個のメニュー項目を計画しています(1レベルの深さのみ)。ユーザーが自分のコントロールに入力したときに、それらをフィルタリングできるようにしたいと思いますTextBox。初めてメニューを開いたときにアイテムをフィルタリングできることは知っていますが、ユーザーが入力するときに継続的にフィルタリングし、カテゴリメニューアイテムに現在のフィルターに適用できるサブアイテムがない場合にその場でカテゴリを非表示にできるようにしたいです(名前フィルタリング)。

何か案は?

4

4 に答える 4

4

コンテキストメニューストリップ(menuStrip1)を追加しました。これに私は以下を追加しました:

File
   Exit

Edit
   Copy
   Paste
       Further Down

Help
   Arghhhh!

次に、テキストボックス(FilterMenuText)を追加し、OnTextChangedイベントで次の手順を実行します。

    private void FilterMenuText_TextChanged(object sender, EventArgs e)
    {

        foreach (ToolStripMenuItem menuItem in menuStrip1.Items)
        {
            if (menuItem.DropDownItems.Count > 0)
            {
                bool matchFound = false;

                foreach (ToolStripMenuItem childMenuItem in menuItem.DropDownItems)
                {
                    if (childMenuItem.Text.ToUpper().Contains(FilterMenuText.Text.ToUpper()))
                    {
                        matchFound = true;
                        break;
                    }
                }

                menuItem.Visible = matchFound;

            }
        }

    }

これにより、子メニュー項目の内容に基づいて、必要に応じて最上位のMenuItemが非表示および表示されます。メニューに複数のレベルのドロップダウンがある場合は、foreachを次のような再帰関数に入れます。

private void FilterMenuText_TextChanged(object sender, EventArgs e)
{

    foreach (ToolStripMenuItem menuItem in menuStrip1.Items)
    {
        menuItem.Visible = MenuItemHasChildWithName(menuItem, FilterMenuText.Text);
    }

}


private bool MenuItemHasChildWithName(ToolStripMenuItem menuItem, string name)
{

    if (!menuItem.HasDropDownItems)
    {
        return false;
    }

    bool matchFound = false;

    foreach (ToolStripMenuItem childMenuItem in menuItem.DropDownItems)
    {

        if (childMenuItem.Text.ToUpper().Contains(name.ToUpper()))
        {
            matchFound = true;
            break;
        }

        if (childMenuItem.HasDropDownItems)
        {
            matchFound = MenuItemHasChildWithName(childMenuItem, name);

            if(matchFound) { break; }

        }

    }

    return matchFound;

}
于 2011-12-14T22:25:00.860 に答える
2

これは、コンテキストメニューにメニュー項目を条件付きで表示するために使用したものです。同じメニューを使用して表示したくない場合は、同じループ内の各項目をtrueに設定するだけです。

    private void dgViewData_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Right)
        {
            if (dgViewData.HitTest(e.X, e.Y).Type != DataGridViewHitTestType.ColumnHeader)
            {
                foreach (ToolStripMenuItem menuItem in conMicImport.Items)
                {
                    menuItem.Visible = menuItem.Text.ToString().Contains("Add") == true ? false : true;
                }

                conMicImport.Show(dgViewData, e.Location);
                ctxtDG = dgViewData;
            }
        }

    }
于 2012-12-01T19:06:50.137 に答える
1

ツールストリップオブジェクトを表示したくない場合は、ツールストリップオブジェクトのVisibleプロパティをfalseに設定します。

于 2011-12-14T22:13:45.847 に答える
1

たとえば、Webフォームアプリケーションを使用してこれを実行しました

foreach (Control c in Page.Form.Controls)
            {
                //Response.Write("WORD2" + c.GetType());
                if (c is Panel)
                {
                    foreach (Control p in c.Controls)
                    {
                        if (p is CheckBoxList)
                        {
                            foreach (ListItem li in ((CheckBoxList)p).Items)
                            {
                                li.Selected = false;
                            }
                        }
                    }
                }
            }
于 2011-12-14T22:14:07.193 に答える