tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル DataGridViewの描画について
投稿日: 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の処理が上手く反映されています。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。