这可能吗?
我计划有 10 个菜单项,其中将有子菜单项(仅 1 级深)。TextBox
当用户输入我的控件时,我希望能够过滤它们。我知道我可以在第一次打开菜单时过滤项目,但是当类别菜单项没有适用于当前过滤器的子项(通过名称过滤)。
有任何想法吗?
这可能吗?
我计划有 10 个菜单项,其中将有子菜单项(仅 1 级深)。TextBox
当用户输入我的控件时,我希望能够过滤它们。我知道我可以在第一次打开菜单时过滤项目,但是当类别菜单项没有适用于当前过滤器的子项(通过名称过滤)。
有任何想法吗?
我添加了一个上下文菜单条(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;
}
这就是我用于在上下文菜单上有条件地显示菜单项的方法。如果您使用相同的菜单并且不想显示它,您只需将同一循环中的每个项目设置为 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;
}
}
}
当您不希望它出现时,将工具条对象的 Visible 属性设置为 false。
例如,我使用 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;
}
}
}
}
}