tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルDataGridViewの描画について
記事No10039
投稿日: 2010/04/02(Fri) 10:09
投稿者皐月
いつもお世話になっております。WindowsXPでVB2005を利用して開発を行っています。
今回tabControlの上に乗ったDataGridViewにチェックボックスを追加しました。(このDataGridViewはTabControlのタブを変更しても消えないので、子コントロールではないです。タブの切替によってDataGridViewに挿入するデータを変化させます。)質問はこのチェックボックスの再描画についてです。
このチェックボックスを条件によって、チェック可/不可を分けたかったのでReadOnlyを利用し、チェック可なチェックボックスとチェック不可なチェックボックスを作成しました。
チェック不可なものは、チェックボックスのEnableをFalseのように見せかけたかったので、以下のURLを参考にCellPainting イベントで処理を行いました。

DataGridViewのチェックボックスを押下不可にするには?
http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200704/07040078.txt

以下が実際に記述したソースです
******************************************
    Private Sub DataGridView1_CellPainting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting
        '動作自体は ReadOnlyで行い、チェックボックスの見た目は以下の処理で作成する
        If e.ColumnIndex = cPV AndAlso e.RowIndex >= 0 Then 'セルがcPVでヘッダー以外の場合
            If DataGridView1.Rows(e.RowIndex).Cells(cPV).ReadOnly = True Then 'チェックボックスのセルが、ReadOnlyの場合
                Dim selected As Boolean = CBool(e.State And DataGridViewElementStates.Selected)
                e.PaintBackground(e.CellBounds, selected)
                Dim rect As Rectangle = e.CellBounds
                rect.Offset(0, rect.Height \ 2 - 8)
                rect.Height = 13
                ControlPaint.DrawCheckBox(e.Graphics, rect, ButtonState.Inactive)
                e.Handled = True
            End If
        End If
    End Sub
******************************************

この記述で、tabControlのタブの切替を行った時、タブ切替前のチェックボックスの描画状態が残ってしまいチェック可能に見えてしまいます。実際はReadOnlyプロパティがTrueですので、チェックは行えずチェックしようとするとチェックボックスの見た目がEnable=Falseに変化するのですが、これではチェックボックスをチェックするまでチェックボックスのReadOnlyの状態がわかりません。どのような処理をすればタブ切替時にCellPaintingの内容が反映されるでしょうかご存知の方ご教授ください。

現状では、ウィンドウを最小化したり、ManagerTab2.ChangeTabPageVisible(x, True)などの処理でタブの数を変更するとCellPaintingの処理が上手く反映されています。

[ツリー表示へ]
タイトルRe: DataGridViewの描画について
記事No10040
投稿日: 2010/04/02(Fri) 10:23
投稿者魔界の仮面弁士
> タブ切替前のチェックボックスの描画状態が残ってしまい

チェックボックスの「値」ではなく、「ReadOnly」に依存する作りに
している場合は、ReadOnly の状態を変えた後で、
InvalidateCell/InvalidateRow/InvalidateColumn/Invalidate メソッドを
呼び出して、再描画を要求してみてください。

# データに依存させている場合は、データ変更時に自動的に再描画される筈…。


> If DataGridView1.Rows(e.RowIndex).Cells(cPV).ReadOnly = True Then
Rows から行全体を取得する必要はないはずです。必要なのは単一セルのみなので
「If DataGridView1(e.ColumnIndex, e.RowIndex).ReadOnly Then
を使いましょう。

[ツリー表示へ]
タイトルRe^2: DataGridViewの描画について
記事No10041
投稿日: 2010/04/02(Fri) 11:20
投稿者皐月
レスありがとうございます。ご指摘のように

> InvalidateCell/InvalidateRow/InvalidateColumn/Invalidate メソッドを
> 呼び出して、再描画を要求してみてください。

で再描画されました。ありがとうございます。

> > If DataGridView1.Rows(e.RowIndex).Cells(cPV).ReadOnly = True Then
> Rows から行全体を取得する必要はないはずです。必要なのは単一セルのみなので
> 「If DataGridView1(e.ColumnIndex, e.RowIndex).ReadOnly Then
> を使いましょう。

ご指摘ありがとうございます。とても参考になりました。

[ツリー表示へ]