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

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

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

Re[4]: DataGridViewのセル結合風表示での選択状態表示


(過去ログ 112 を表示中)

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

■66640 / inTopicNo.1)  DataGridViewのセル結合風表示での選択状態表示
  
□投稿者/ FX2 (1回)-(2013/05/13(Mon) 11:20:13)

分類:[VB.NET/VB2005 以降] 

こんにちは。
VB 2008のDataGridViewを使って表形式の一覧を表示していますが、
以下のように「所属」「メンバー」(以下、メンバーの情報が続く)を表示しています。
|所属 |メンバー|・・・|
|−−−|−−−−|−−−|
|○○課|○○○○|   |
|○○課|△△△△|   |
|□□課|□□□□|   |
|□□課|◇◇◇◇|   |
|□□課|※※※※|   |
|△△課|@@@@|   |

ソート順は所属・メンバーで、DataGridView上でのセルの編集は行わない(ReadOnly)ため、
「所属」列の同じ値をExcelのセル結合のように出来ないかと思い、以下の掲示板の内容を参考に
セル結合されているような見た目にすることに成功しました。

|所属 |メンバー|・・・|
|−−−|−−−−|−−−|
|○○課|○○○○|   |
|   |−−−−|−−−|
|   |△△△△|   |
|−−−|−−−−|−−−|
|□□課|□□□□|   |
|   |−−−−|−−−|
|   |◇◇◇◇|   |
|   |−−−−|−−−|
|   |※※※※|   |
|−−−|−−−−|−−−|
|△△課|@@@@|   |

参考サイト:
http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200903/09030035.txt

ただ、この場合、上の例でいうと「所属」列の「○○課」に該当する任意のセル(1〜3行目に該当)を
クリックするとそのセルだけ選択状態の表示となりますが、ここをクリックした場合、「所属」列の
「○○課」に該当するすべてのセルを選択状態で表示させるにはどうすればよいでしょうか?

対象セルの背景をSelectionBackColorに、文字をSelectionForeColorにしてオーナードローすればいいと
思うのですが、CellPaintingイベントの中でどうやって他の行の描画をさせればいいのか全く見当がつかず、
また、うまくやらないと、同じセルのCellPaintingイベントが何度も重複してしまうようで、頭の整理がつきません。

このようなことを実現するにはどうすればよいか、アドバイスを頂けないでしょうか。
よろしくお願い申し上げます。

引用返信 編集キー/
■66650 / inTopicNo.2)  Re[1]: DataGridViewのセル結合風表示での選択状態表示
□投稿者/ shu (312回)-(2013/05/13(Mon) 15:02:10)
No66640 (FX2 さん) に返信

SelectionChangedイベント内で選択されたセルを判断し
そのセルと同時に選択状態にするセルに対しSelected=Trueとする。
ただしこの処理により再帰的にイベントが発生してしまうので
フラグ処理によるガードが必要になります。
イメージとしては以下のような感じ

private flg as boolean = false

Private Sub DataGridView1_SelectionChanged(〜) Handles DataGridView1.SelectionChanged
    if flg then exit sub
    flg = true
    If 該当セル then
         for each cell As DataGridViewCell in 同一所属のセル(自分は除く)
             cell.Selected = True
         Next
    End If
    flg = false
End Sub


引用返信 編集キー/
■66653 / inTopicNo.3)  Re[2]: DataGridViewのセル結合風表示での選択状態表示
□投稿者/ FX2 (2回)-(2013/05/13(Mon) 15:50:50)
shu さん、ご回答ありがとうございました。
ただ、shu さんに教えて頂いた方法をやってみたら、同一所属セルの一番下の行のみが選択状態となってしまいました。
色々調べたところ、DataGridViewのMultiSelectがFalseになっているとこのような現象が発生してしまうことが分かり、
このMultiSelectをTrueにしたところ、shu さんの方法できれいに同一所属セルが選択状態の表示となりました。

MultiSelectがFalseの状態でこれを行うにはどうすればいいでしょうか?
引用返信 編集キー/
■66654 / inTopicNo.4)  Re[3]: DataGridViewのセル結合風表示での選択状態表示
□投稿者/ shu (313回)-(2013/05/13(Mon) 16:31:34)
No66653 (FX2 さん) に返信
> MultiSelectがFalseの状態でこれを行うにはどうすればいいでしょうか?
この条件だとCellPaintingでの背景描画、境界描画、前景描画などを
すべて行う必要があるかと思います。背景描画はちょっと試したところ
SelectedでないセルはPaintBackGround(〜,True)にしても背景色が変わらなかったので
e.Graphics.FillRectangleする必要がありそうです。

SelectionChangedでは選択前に描画上選択されていたセル及び新しく描画上
選択されたセルについてInvalidateCellを行う必要があります。
引用返信 編集キー/
■66656 / inTopicNo.5)  Re[4]: DataGridViewのセル結合風表示での選択状態表示
□投稿者/ FX2 (3回)-(2013/05/13(Mon) 16:50:46)
shu さん、いつもお世話になります。

確かに、前に選択していた行の選択表示解除も考慮しなければなりませんね。
結構大変そうですが、shu さんのアイディアを元に、試行錯誤してみます。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -