タイトル一覧   関連タグ: C#
タグ: C# タイトル:DataGridViewのCellContentClickイベントに関しまして
1
1:  お名前:PG 2011/01/13 11:11:37

環境/言語:[C#2005] 

DataGridViewのCellContentClickイベントとListViewのItem_Activateイベントの組み合わせで問題が発生しております。
以下の手順で再現できます。

以下の2つのフォームを用意

フォームA
○DataGridView
・ボタン列を設定
→CellContentClickイベントでフォームBをShowDialog()で開く

フォームB
○ListView
・Viewプロパティ = Details
・適当な行を用意しておく
・Item_Activateイベントを設ける
→行のダブルクリック(Item_Activateイベント)でDialogResult.OKとし、フォームBが閉じるようにしている

1.フォームAのDataGridViewのボタンをクリックし、フォームBを開く
2.フォームBのListViewをダブルクリックし、フォームを閉じる
(フォームBを閉じた時に、マウスポインタが1.でクリックしたボタンの位置になるようにフォームを閉じる)
3.フォームBが再度開かれてしまう


上記の手順で行いますと、フォームBを閉じた後にフォームAのDataGridViewのCellContentClickイベントがどういうわけか再度発生してしまいます。

何か回避策はありませんでしょうか?

ご教授お願いします。
2:  お名前:石野光仁 2011/01/13 13:09:25

こんにちは、アイライトの石野です。

手元に、VS2008があったのでそちらで確認しましたが
イベントが重複して上がる事はなかったですね。

VS2005でも確認してみたいと思います。

なんとなく思うところとしては、イベントが重複で登録されてないでしょうか?
関連するイベントを調べてみてください。 += new とかを検索すると見つけやすいのではないでしょうか?
3:  お名前:PG 2011/01/13 15:31:20

VS2008では確認されませんでしたか・・・。

是非ともVS2005でもご確認ください。

イベントは重複しておりません。

サンプルPGが作れる余裕があれば、用意いたします。
4:  お名前:石野光仁 2011/01/13 16:02:51

ごめんなさい。。。
読みこぼしていました・・・

グリッドのボタンの上に、2枚目の画面を重ねておいてダブルクリックをするのですね。。。

現象が出ますね。回避コードを考えてみましょう。
5:  お名前:石野光仁 2011/01/13 16:30:56

ちなみに、VS2008でも同じ動作で、問題の根本はDataGridViewがマウスのイベントを吸い取っていますね。

さて、どうやってDataGridViewからマウスのイベントを吐き出させるかが問題ですね。
6:  お名前:PG 2011/01/13 17:42:40

現象確認できてよかったです。

果たして、どうすればDataGridViewからマウスのイベントを吐き出せるのでしょうか。。。
7:  お名前:石野光仁 2011/01/13 19:04:51

CellContentClickイベント嫌いーー

CellClickで代用すると、それらしくなります。

これで回避してもらえませんか?
8:  お名前:PG 2011/01/14 10:28:55

CellClickで代用しましたところ、今のところ回避できているような気がします♪
ボタンはCellContentClickイベントを使うものだと思っていたのですが、CellClickイベントとはどのような違いがあるのでしょうか?

ボタン以外のCellTypeで弊害が起きるのでしょうか??
9:  お名前:石野光仁 2011/01/14 10:35:33

こんにちは、アイライトです。

CellClickだと、ボタン以外の項目でも反応すると思います。
ColumnIndexを見てボタンだけを反応するようにしておけば、見た感じ問題ないように思えました。

上手く行って何よりです。
10:  お名前:PG 2011/01/14 13:56:48

ご返答ありがとうございます。

セルのサイズに対してボタンのサイズが小さく、余白があるような場合は少し違和感がありますが、セルのサイズ = ボタンのサイズの仕様なので今回は問題ありません。

この度はお忙しい中、ご親切にありがとうございましたm(__)m

別件でご相談することが今後ありましたら、またよろしくお願いいたします。
1
お名前
メッセージ
次回のために入力情報を記録