DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DataGridView に 設定した ContextMenuStrip について

環境/言語:[C# .NET Framework 2.0]
分類:[.NET]

はじめまして、いつも拝見させて頂いてます。

DataGridView に設定した ContextMenuStrip の項目を
右クリックした行によって無効にしたり有効にしたり
したいと考えてます。
CellMouseDown のイベント時に ContextMenuStrip の項目を
Enable = false に設定しているのですが、無効になりません。
DataGridView に行を追加して、追加した行で右クリックを
すると無効になっています。

解決策がありましたら教えてください。
よろしくお願いします。
Enabledの設定はContextMenuStrip.Openingでおこなう必要があると思います。
ContextMenuStripプロパティを設定しているなら、メニューの表示はお任せですので
CellMouseDownイベントではタイミングとして表示された後になり遅いのではないでしょうか。
ご回答ありがとうございます。

設定のタイミングは ContextMenuStrip.Opening のほうがいいと思います。
しかしながら項目に Enable = false を設定しても無効にはなりません。

再度、ご教授お願いします。

■No20706に返信(まどかさんの記事)
> Enabledの設定はContextMenuStrip.Openingでおこなう必要があると思います。
> ContextMenuStripプロパティを設定しているなら、メニューの表示はお任せですので
> CellMouseDownイベントではタイミングとして表示された後になり遅いのではないでしょうか。
ヘッダーやデータのない行でコンテキストメニューを出したくなかった
ので、DataGridView の RowTemplate の ContextMenuStrip に設定して
いました。
それが原因で Enabled の設定が反映されなかったようです。
DataGridView の ContextMenuStrip に設定したら問題ありませんでした。

それで、ヘッダーやデータのない行で右クリックされた時には
MouseUp のイベントで ContextMenuStrip を閉じてしまおうと
考えていますが、もっとスマートな方法がありましたらご教授ください。
> それで、ヘッダーやデータのない行で右クリックされた時には
> MouseUp のイベントで ContextMenuStrip を閉じてしまおうと
> 考えていますが、もっとスマートな方法がありましたらご教授ください。

Openingイベントのイベント引数を調べましょう。
どんなイベントであれ、引数がEventArgsでない場合はどんなプロパティがあるかはその場で調べるようにしたほうがよいです。
ご回答ありがとうございます。

イベント引数 CancelEventArgs に true を設定することで
コンテキストメニューを開かないようにできました。

Opening イベント時にDataGridViewのヘッダーでクリックされているか
調べる方法はありますか?

> Openingイベントのイベント引数を調べましょう。
> どんなイベントであれ、引数がEventArgsでない場合はどんなプロパティがあるかはその場で調べるようにしたほうがよいです。
> Opening イベント時にDataGridViewのヘッダーでクリックされているか
> 調べる方法はありますか?

使ったことが無いのでぜんぜん詳しくないのですが、パッとMSDNを見た限り、
CellContextMenuStripNeededやRowContextMenuStripNeededの挙動によっては
そこでフラグを設定するなりして判断できそうな気がしますが。
#予想です。

場合によってはマウスポインタの位置を気にせずにそのときの選択行に対して機能するという仕様でもいいかも。

無理やりやるなら、イベントの発生順序の制約はありますが
MouseDown系のイベントでマウスポインタの座標を判断するといったことになるでしょう。
2007/10/16(Tue) 16:48:26 編集(投稿者)
2007/10/16(Tue) 16:48:21 編集(投稿者)

いろいろ教えていただいてありがとうございました。

DataGridView の CellMouseUp イベントの 引数が RowIndex == -1
の場合はセル以外であると判断できるので、これを使おうと思います。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板