2

私のWindowsアプリケーションには、グリッド付きのコンテキストメニューがあります。問題は、ユーザーの権限に応じてコンテキストメニューでToolStripMenuItemを無効にしたいということです。どうすればそれを行うことができますか。私はこのようにしましたが、機能していません

private void contextMenuStrip_Machine_Opening(object sender, CancelEventArgs e)
{
    toolStripAuthorize.Enabled = INFOpermission.accessAuthorize;
} 

しかし、それは機能していません

4

1 に答える 1

6

toolStripAuthorize.Enabledまたはのいずれかtrueに設定する必要がありますfalse

それを定義するコード(列挙型?)を示していないので何INFOpermission.accessAuthorizeが何なのかわかりませんが、それが 以外の場合false、期待どおりに機能しません。

無効にしたいのEnabledプロパティイベントハンドラ設定すると、動作することを保証できます。うまくいかない場合は、別のことをしている可能性があります。続行するには、さらに情報を提供する必要があります。ToolStripMenuItemfalseOpening

行き詰まっている場合は、次のサンプル コードを参照してください:方法: ContextMenuStrip オープニング イベントを処理する


編集:コメントで提供された新しい情報を武器に、問題の原因を特定しました。コントロールの にを割り当てたContextMenuStripため、そのコンテキスト メニューに含まれる項目をそのイベント ハンドラー メソッドで変更できません。RowTemplateDataGridViewOpening

これは、誰かが「設計による」と判断した既知のバグであることが判明しました。元のバグ レポートは、Microsoft Connect で参照できます。与えられた説明は、に基づいて新しい行が作成されるたびにRowTemplate(これがどのようにRowTemplate機能するか)、ContextMenuStrip割り当てた も複製されるということです。つまり、各行で同じコンテキスト メニュー インスタンスが使用されるわけではなく、元のメニュー項目に設定しようとしたプロパティが無効になります。

幸いなことに、回避策も提供されます。すべてのイベントと同様に、このイベントは、開こうOpeningとしている の実際のインスタンスをパラメーターContextMenuStripとして渡しsenderます。これは、変更を表示するために変更する必要がある項目のコンテキスト メニューです。

それで、コードは何ですか?次のようになります。

private void contextMenuStrip_Opening(object sender, CancelEventArgs e)
{
    ContextMenuStrip cmnu = (ContextMenuStrip)sender;
    cmnu.Items[1].Enabled = false;
}

ただし、変更する個々のメニュー項目をそのインデックスで参照する必要があることに注意してください。これは、変更するメニュー内の項目のゼロベースの位置です。toolStripAuthorize新しいコンテキスト メニュー インスタンスごとにオブジェクトの新しいインスタンスが複製されているため、以前にしようとしていたようにオブジェクトを使用することはできません。

于 2011-01-14T10:54:50.620 に答える