Я добавил полосу контекстного меню (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;
}
}
}
Это будет скрывать иотображать элементы меню верхнего уровня в зависимости от содержимого дочерних элементов меню.Если в вашем меню более одного уровня выпадающего меню, поместите 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;
}