2017-12-27 10 views
0

menustrip項目を反復する答えは見つかっても、menuStripsを繰り返し処理することはできません(私はForm内にcontextMenuStripをいくつか持っています)。MenuStripsを繰り返します。

foreach(Control c in this.Controls) 
{ 
    if(c is ContextMenuStrip) 
    { 
     // This doesn't work. I figured out contextmenustrips are not 
     // holding in this.Controls 
    } 
} 
+1

あなたは、デバッガを使用してコードをステップ実行、変数の検査などがあります。 –

+0

試してみよう:this.components.Components – Nick

+0

@Nickによると、フォームのコンストラクタのInitializeComponent()メソッドを見ると、this.componentsにContextMenuStripが追加されていることがわかります。 – Aaron

答えて

1
foreach(var ctrl in this.components.Components) 
{ 
    if (ctrl is ContextMenuStrip ctx) 
    { 
     MessageBox.Show(ctx.GetType().Name); 
    } 
} 
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); 
} 
+0

これもうまくいきました。ありがとう。 – Mert

1

ContextMenuStripsは、コンポーネントではなく、コントロールの一部です。

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

OR

ContextMenuStrip cStrip = null;  
foreach(var c in components.Components) 
{ 
    cStrip = c as ContextMenuStrip; 
    if(cStrip!=null) 
    { 
    } 
}