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

ListViewにボタンを追加するには?

環境/言語:[VisualStudio2003+.NET Framework1.1]
分類:[.NET]

いつもお世話になります。ののです。
ListViewのカラムにボタンを表示させたいのですが、どのようにすればいいのか
皆目見当が付きません。
ヒントでも構いませんので、ご教授のほどよろしくお願いします。
DataGridViewやサードパーティのFlexGrid(ボタンに対応していたかは不明)やSPREADを使うことになると思います。
DataGridViewについては、ここどぼんさんのTipsにあるようです。

ListViewへとなるとそういう処理を組み込むことになります。

例としては
・オーナードローにしてDrawItem内で適切な位置へ表示させる。

・ListView.Controls.Addで必要なボタンを追加して適切な位置へ表示して、適切にスクロールさせる。
#WndProcでWM_VSCROLL,WM_HSCROLLを拾う。場合によってはマウスホイールも。

というところでしょうか。
選択行のみではなく全行となると、見える分だけ用意してスクロールごとに行と対応付けをするなどの工夫がいるでしょう。
はじめまして、引っ込んだ略と申します。
 
 サンプルを書いてみました。
 ※ 使用した開発環境はVB2008ExpressEdition(対象Frameworkは .NET Framework 2.0)です。
 
 http://dobon.net/cgi-bin/up/files/038.zip
 
 # すみませんが、VS2003で動作するかどうかはわかりません。
 # (コンパイルエラーにならなければOKです)
 
 (説明)
 System.Windows.Forms.ListViewのDetailsビューで、
 Button(実体はListViewSubItem)を表示する機能を実装しました。
 
 ListViewのOwnerDrawプロパティをTrueにして、
 Overrides OnDrawSubItem()メソッド内でButtonの画像を描画しています。
 Buttonの画像の取得は、Control.DrawToBitmap()メソッドで行っています。
 クリック判定等はListView.HitTest()メソッドで行っています。
 
 本プログラムは2つのクラスで構成されます。
  ListViewButtonExtension   ・・・ ListViewの派生クラス
  ListViewButtonTestForm    ・・・ テスト用Form
 
 ※ 念のため、使用は自己責任でお願いします。
 ※ コードの改変、再頒布は自由です。(但し、私のコードにその価値があるかは不明w)
 
以上、参考になれば幸いです。
2008/04/01(Tue) 23:25:18 編集(投稿者)

引っ込んだ略と申します。
 
 私のプログラムに不具合がありました。
 
 1.まず、VS2003では動作しません。(ごめんなさい)
 
   .NET Framework 1.1(以下、.NET1.1と略記)のListViewの場合、
   OwnerDrawプロパティが使用できません。(VB2005のオフラインヘルプで確認)。
   しかも、私の知識の範囲では、Paintイベントによる直接描画ができないようです(これは.NET2.0で確認)。
   そのため、Button画像の直接描画はあきらめ、
   System.Windows.Forms.Buttonインスタンスを直接配置する方法を検討したところ、
   .NET1.1のListViewでは、ColumnWidthChanged、ColumnReorderedの各イベントが使用不可なので、
   (↑VB2005のオフラインヘルプで確認)
   列順序と列幅の変更を検出することができず(私には代替手段を見つけられなかった)、
   System.Windows.Forms.Buttonの位置と大きさを常にきちんと表示させることができなかったため、
   .NET Framework 1.1ではとりあえず断念せざるを得ませんでした。
 
 
 2..NET Framework 2.0の場合、動作しますが、横スクロールするとButtonの位置が変になる不具合がありました。
   この不具合は、GetScrollInfo API呼び出しを使用することで、解決できました。
   また、Button画像の描画方法を、ButtonRenderer.DrawButton()メソッドを使用する方法に変更しました。
 
 修正版のコードを掲載します(修正前のコードは削除しました)。
 
  http://dobon.net/cgi-bin/up/files/039.zip
 
以上、取り急ぎご報告します。
 
[追記]
 Public Class ListViewButtonExtensionの、Protected Overrides Sub OnMouseUp()メソッド内のコードで、
 単純ミスが1つありました。
 (誤)MyBase.OnMouseDown(e)
 (正)MyBase.OnMouseUp(e)
[/追記]

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