通过MenuStrips迭代[关闭]

问题描述 投票:0回答:3

我找到了迭代menustrip项目的答案,但没有运气通过menuStrips迭代(假设我在表单中有一些contextMenuStrip)。

foreach(Control c in this.Controls)
{ 
    if(c is ContextMenuStrip)
    {
        // This doesn't work. I figured out contextmenustrips are not
        // holding in this.Controls
    }
}
c# winforms controls
3个回答
1
投票

如果您需要使用任何表单,您需要使用反射访问它的私有字段。因为ContextMenuStrip是私有成员。这是一种适用于任何给定形式的方法:

private IEnumerable<ContextMenuStrip> EnumerateContextMenus(Form form)
{
  const BindingFlags bindingFlags = BindingFlags.NonPublic | BindingFlags.Instance;
  var fields = form.GetType().GetFields(bindingFlags);
  return fields
    .Where(x => x.FieldType == typeof(ContextMenuStrip))
    .Select(x => x.GetValue(form) as ContextMenuStrip);
}

1
投票
foreach(var ctrl in this.components.Components)
{
    if (ctrl is ContextMenuStrip ctx)
    {
        MessageBox.Show(ctx.GetType().Name);
    }
}

1
投票

ContextMenuStrips是组件的一部分,而不是控件。

foreach(var c in components.Components)
{ 
   if(c is ContextMenuStrip)
   {
   }
}

要么

 ContextMenuStrip cStrip = null;    
 foreach(var c in components.Components)
 { 
   cStrip = c as ContextMenuStrip;
   if(cStrip!=null)
   {
   }
 }
© www.soinside.com 2019 - 2024. All rights reserved.