C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: DataGridViewのカスタム列がクリックされたことを、


(過去ログ 12 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■3290 / inTopicNo.1)  DataGridViewのカスタム列がクリックされたことを、
  
□投稿者/ しろやぎ (5回)-(2007/05/01(Tue) 15:38:14)

分類:[C# (Windows)] 

度々お世話になります。
へっぽこプログラマのしろやぎといいます。

現在、DataGridViewColumnsを継承したDataGridViewMiniButtonColumnクラスと
DataGridViewCellを継承したDataGridViewMiniButtonCellクラスを作っています。
後者は前者のテンプレートとして使用するDataGridViewCellです。

これはどんなものかというと、セルの右端に小さなボタンが付いていて、そのボタンを
押すことで何らかの設定ダイアログを出そうというものです。
DataGridViewで色を選択させたい場合やブラシの選択をさせたい場合に使おうと思っています。
ボタン以外のスペースに、選択された色なり選択したブラシで塗りつぶす予定です。

んで、右端のボタンを押したことをDataGridView.CellContentClickイベントで拾いたいのですが、
DataGridViewにどう通知したらいいのか分かりません。

現状では、「右端のボタンが押された」ということは検出できています。
右端のボタンが押された時に、その旨をDataGridViewにどうにかやって通知して、
DataGridView.CellContentClickイベントを通じて右端のボタンが押されたことを知りたいのです。

DataGridViewButtonColumnやDataGridViewButtonCellの場合はボタンが押されたことを
CellContentClick イベントを通じて知ることができますよね。
あんなふうにしたいんです。
DataGridViewButtonColumnとDataGridViewButtonCellがどうなっているのか気になるところです。

どなたか助言いただけませんか。
よろしくお願いします。

引用返信 編集キー/
■3291 / inTopicNo.2)  Re[1]: DataGridViewのカスタム列がクリックされたことを、
□投稿者/ しろやぎ (6回)-(2007/05/01(Tue) 16:30:12)
DataGridViewButtonCellはButtonをホストしていて、IDataGridViewEditingControlが
DataGridView.OnCellContentClickを呼べるような特権を持っているのかな、などと考えてみましたが
DataGridViewButtonCellはButtonをホストしているわけではないようですね。

C++じゃあるまいし、friend的な特権にすがろうとする私はやはり「へっぽこ」... orz

参考文献
MSDNの「IDataGridViewEditingControl インターフェイス」の項目「解説」
引用返信 編集キー/
■3293 / inTopicNo.3)  Re[2]: DataGridViewのカスタム列がクリックされたことを、
□投稿者/ Hongliang (133回)-(2007/05/01(Tue) 18:47:10)
Hongliang さんの Web サイト
DataGridView は、セルがクリックされたらそのセルの DataGridViewCell.GetContentBounds を呼び出して Content かどうかのチェックを行います。
ですので、適当にオーバーライドして下さい。
引用返信 編集キー/
■3295 / inTopicNo.4)  Re[3]: DataGridViewのカスタム列がクリックされたことを、
□投稿者/ しろやぎ (7回)-(2007/05/01(Tue) 23:31:30)
ギャー!!

そのなもズバリなDataGridViewCell.RaiseCellContentClick(DataGridVeiwCellEventArgs)なる
メソッドを発見し自己解決に至りました。
調査不足です。すんません。

しかし、これってやっぱり特権的ですよね。
だって他人のイベントを発動させちゃうんですし...。
リフレクションとか奥の手(?)を使ってるんですかね。
へっぽこプログラマの私には実装の詳細が皆目見当もつきません。


Hongliang さま、書き込みどうもありがとうございました。
GetContentBoundsで右端のボタンの領域を返してやればOK、ってことですか?
んでもって、GetContentBounds().Contains(クリックされた座標)がtrueのときに
DataGridView.CellContentClickが発生する、ってなカラクリなんですかね?
理解力無くてすみません。
ってか、こっちの方が特権的な要素が無いのできれいですよね。

コメントもらえるように、もうしばらくこのままにしておきますね。

引用返信 編集キー/
■3297 / inTopicNo.5)  Re[4]: DataGridViewのカスタム列がクリックされたことを、
□投稿者/ 渋木宏明(ひどり) (198回)-(2007/05/02(Wed) 00:19:35)
渋木宏明(ひどり) さんの Web サイト
> しかし、これってやっぱり特権的ですよね。

そお?

> だって他人のイベントを発動させちゃうんですし...。

セルの中でやってるなら「他人」ではないと思いますけど。

それに、イベントの要件(結果的にイベントハンドラに渡される情報の様式や内容)さえ満たしていれば誰がそれを発生させる(起点になる)かはそれほど重要なことではないと思います。

> リフレクションとか奥の手(?)を使ってるんですかね。

Grid の中でやってるなら、必要ないと思います。

普通に

void RaiseCellContentClick(DataGridVeiwCellEventArgs e)
{
if (this.CellContentClick != null)
{
this.CellContentClick(this, e);
}
}

ってやってるだけかと。

名前が OnXXX じゃないところがちょっと気になるけど。

}

引用返信 編集キー/
■3299 / inTopicNo.6)  Re[5]: DataGridViewのカスタム列がクリックされたことを、
□投稿者/ Hongliang (134回)-(2007/05/02(Wed) 00:41:07)
Hongliang さんの Web サイト
> Grid の中でやってるなら、必要ないと思います。
> 名前が OnXXX じゃないところがちょっと気になるけど。

DataGridView ではなく DataGridViewCell の方に Raise... があるのがポイントです。
DataGridView の方に internal なイベント起動メソッドを用意していると思われますね。
// 確かにちょっと気持ち悪い。
引用返信 編集キー/
■3300 / inTopicNo.7)  Re[6]: DataGridViewのカスタム列がクリックされたことを、
□投稿者/ しろやぎ (9回)-(2007/05/02(Wed) 00:57:26)
そっかぁ!!
internalってこうやって使うもんなんですね。
でも、公開する相手を指定できるfrie (ry
解決済み
引用返信 編集キー/
■3301 / inTopicNo.8)  Re[6]: DataGridViewのカスタム列がクリックされたことを、
□投稿者/ 渋木宏明(ひどり) (199回)-(2007/05/02(Wed) 02:24:42)
渋木宏明(ひどり) さんの Web サイト
> DataGridView ではなく DataGridViewCell の方に Raise... があるのがポイントです。
> DataGridView の方に internal なイベント起動メソッドを用意していると思われますね。

あー、なるほど。Grid がイベントを中継しているだけかと思ったけど、そうじゃなさそうってことですね。

# だから OnXXX じゃないのか。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -