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

DataGridのセルにボタンを作成する

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

C#で、DataGridのセルにボタンを入れたいのですが可能でしょうか?
調べてもASPではできるみたいなことしか見つけられません。
もしできるのであれば作成例などを教えてもらえるとうれしいです。
よろしくお願いします。
.NETプログラミング研究 第37号
・DataGridにLinkLabelを表示するには?
http://dobon.net/vb/melma/dotnet37.txt

の内容を応用すればお望みのこと(或いはそれに近いこと)も可能ではないかと。
#私は試みたことないのですが。
■No7028に返信(深山さんの記事)
> .NETプログラミング研究 第37号
> ・DataGridにLinkLabelを表示するには?
> http://dobon.net/vb/melma/dotnet37.txt
>
> の内容を応用すればお望みのこと(或いはそれに近いこと)も可能ではないかと。
> #私は試みたことないのですが。

ありがとうございます。確かに応用すればできそうな気がしますが・・
う〜ん、理屈はわかるんですが実際に作るとなるとどうしたらいいのか・・・
アクティブセルだけでなく、すべての行にボタンを表示する為にはPaintメソッドで
あたかもボタンのように見せかける描画が必要ってことですよね?
通常のボタン描画の他に、ボタンが押された時の描画も必要になるのかな。
MouseDownイベントでHitTestInfoメソッドを用いセル上でマウスが押されたら押された
時用の描画をする形ですかね。
> アクティブセルだけでなく、すべての行にボタンを表示する為にはPaintメソッドで
> あたかもボタンのように見せかける描画が必要ってことですよね?

 はい、そうなりますね。ボタンの描画には ControlPaint.DrawButton メソッドを使用します。
 描画例はこちらを参照のこと。

コントロールを描画する
http://dobon.net/vb/dotnet/graphics/drawcontrols.html


> 通常のボタン描画の他に、ボタンが押された時の描画も必要になるのかな。

 マウスポインタが描画領域内にあって、且つ左ボタンが押されていたら ButtonState.Pushed で DrawButton してあげれば良いでしょう。
 マウスの情報は Control.MousePosition プロパティ、 Control.MouseButtons プロパティで取得できます。
#座標は PointToClient メソッドでの変換が必要だったかな? 面倒であれば MouseMove イベントで取得して、プライベート変数に持っておく方法もあります。

【補足】
 上記で
> MouseDownイベントでHitTestInfoメソッドを用いセル上でマウスが押されたら押された
> 時用の描画をする形ですかね。
としなかったのは、ボタン上で左ボタンを押したままボタンの領域外や別のボタン上にマウスを移動させたときのことがあるからです。
#タイプミスだとは思いますが、 HitTestInfo はメソッドではなくクラスですね(^_^;)

 その他
 ・ボタンに表示する文字列をどうするのか?
 ・ボタンが押されたときにアクティブであることを示す破線は表示するのか?
などにより、 Paint メソッド内で行うべき処理内容は変わるでしょう。


 あとは MoseDown / MouseUp イベントで HitTest を行い、(この列の)同一セルであればボタンクリックのイベントを発生させるようにすれば取り敢えず形になるでしょうか。
 イベントの引数にはクリックされた行の DataRowView があると使い易いと思います。
#勿論、他にも検証が必要になる項目が出てくるとは思いますが。

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