2011-01-14 33 views
2

私のWindowsアプリケーションではグリッドのコンテキストメニューがありますが、問題はユーザーのprevilages.Howに従ってコンテキストメニューのToolStripMenuItemを無効にしたいということです。私はこのように行われているが、それはコンテキストメニューのToolStripMenuItemを動的に無効にする方法は?

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

が動作していないが、それはあなたがtrueまたはfalseのいずれかにtoolStripAuthorize.Enabledを設定する必要が

+1

1.私たちにもっとコードを教えてください。 2.割り当て後にブレークポイントを設定すると、toolStripAuthorizeにEnabledがfalseまたはtrueに設定されていますか? 3. INFOpermission.accessAuthorizeは期待どおりにfalseに設定されていますか? – dzendras

答えて

6

を働いていません。

私はあなたがそれ(列挙型?)定義するコードを示さなかったが、それはfalse以外だ場合、これはあなたが期待するように動作するように行くのではありません。ので、INFOpermission.accessAuthorizeが何であるか見当がつかない

私はあなたがOpening eventハンドラfalseに無効にするToolStripMenuItemEnabled propertyを設定することがを動作することを保証することができます。それはあなたのために働いていない場合、あなたは何か間違っている、あなたは私たちに行くためにいくつかの詳細を与える必要があります。

あなたが立ち往生している場合は、ここではサンプルコードを参照してください。How to: Handle the ContextMenuStrip Opening Event


EDIT:コメントで提供された新しい情報で武装を、私は今、問題の原因を分離しました。 ContextMenuStripDataGridViewコントロールのRowTemplateに割り当てたため、Openingイベントハンドラーメソッドでそのコンテキストメニューに含まれる項目を変更することはできません。

これは、誰かが「設計通りに」決定した既知のバグであることが判明しました。元のバグ報告here on Microsoft Connectを見ることができます。説明は、RowTemplate(つまりRowTemplateの仕組み)に基づいて新しい行が作成されるたびに、割り当てられたContextMenuStripも複製されます。つまり、同じコンテキストメニューインスタンスが各行で使用されず、オリジナルのメニュー項目で設定しようとするプロパティは無効です。

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

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

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

お知らせを、しかし、あなたはそのインデックスによって変更する個々のメニュー項目を参照する必要がありますということ。これは、変更したいメニュー内の項目のゼロベースの位置に過ぎません。新しいインスタンスが新しいコンテキストメニューインスタンスごとに複製されているため、前の手順と同じように、toolStripAuthorizeオブジェクトを使用することはできません。

+0

これはfalseを返していますが、valueも同様ですが、toolstripmenuが表示されています – Nighil

+0

@NIGHIL:*メニュー*はまだ開きます。メニューの開始をキャンセルするには、 'e.Cancel = true'を設定します。特定のアイテムの 'Enabled'プロパティを設定すると、それはメニューの中で灰色で表示されます(選択できません)。あなたは何をしようとしていますか? –

+0

@コードグレー:メニューが開きますが、無効な項目はメニューで有効です。INFOpermission.accessAuthorizeの値はfalseです – Nighil

関連する問題