none
TabControl-TabPage内のDataGridView、Cellの背景色が着色できない。 RRS feed

  • 質問

  •  

    こんばんわ。VB初心者です。

    肝心なところで行き詰ってしまい困っています。

     

    フォーム内にTabControlを一つTabPageを二つ作成し、TabPageにはそれぞれDataGridViewを一つずつ配置。

    そしてボタンをクリックするとTabPage1、2の各DataGridViewにデータを表示するプログラムを作成しました。

     

    表示する時には「おまけ」として、行のヘッダには列番号を、データを表示しているセルには背景色をつけるものとしています。

    今回はこの「おまけ」の2つが問題になりました。

     

    まず何も考えずにそのままTabPage1、2のDataGridViewにデータを表示すると、データは問題なく両方とも表示されるのですが、

    TabPage1のみ列番号、背景色の表示ができるのですが、

    TabPage2は列番号、背景色の表示ができません。

     

    今回の問題はこのTabPage2にもはじめから列番号、背景色の表示を行いたいということです。

     

    ちなみにデータを表示した状態で列番号、背景色の表示ができていないTabPage2を選択し、

    もう一度表示するとTabPage1、2どちらも列番号、背景色の表示ができます。

    またデータを表示する前に一度でもTabPage2を選択しておくとTabPage1、2どちらも列番号、背景色の表示ができます。

     

    どういう状態か調べたくてMe.TabPage2.Createdプロパティ値を取得すると

    一度もTabPage2を選択していない状態だとfalseが返ってきて

    一度でもTabPage2を選択しておくとtrueが返ってきます。

     

    これは選択されていないTabPage2は実はまだ作成されていない状態???

    でもデータは表示できる???

    なぞです。

     

    C#にはTabPageクラスにVisibleプロパティというものがあり、これをTrueに設定すると上記事象は解決されるらしいのですが、

    VBはなぜか???TabPageクラスのVisibleプロパティは使用不可となっています。

     

    ここからいろいろ試してはいるもののうまくはいかず

    行き詰ってしまいました。

    どうかよろしくお願いします。

     

    ソースは以下の通りです。

    Public Class Form1
        Private WithEvents targetGrid As CPC_DataGridView
        Private DataGridViewList As Dictionary(Of String, CPC_DataGridView)

        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

            DataGridViewList = New Dictionary(Of String, CPC_DataGridView)
            DataGridViewList.Add("tabPage1", New CPC_DataGridView(Me.DataGridView1))
            DataGridViewList.Add("tabPage2", New CPC_DataGridView(Me.DataGridView2))
        End Sub

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            Console.WriteLine(Me.TabPage1.Created.ToString())’→true
            Console.WriteLine(Me.TabPage2.Created.ToString())’→false(ボタンクリック前にTabPage2にを表示するとtrue)

            Dim view1 As CPC_DataGridView = DataGridViewList("tabPage1")
            view1.View()
            Dim view2 As CPC_DataGridView = DataGridViewList("tabPage2")
            view2.View()
        End Sub
    End Class

    ----------

    'CPC=CentralProcessingControl
    Friend Class CPC_DataGridView
        Private WithEvents myDataGridView As DataGridView

        Friend Sub New(ByVal pDataGridView As DataGridView)
            Me.myDataGridView = pDataGridView
        End Sub
        Friend Sub View()
            Dim dataArray As New ArrayList
            dataArray.Add(New MyData("0001"))
            dataArray.Add(New MyData("0002"))
            Me.myDataGridView.DataSource = dataArray

            Dim count As Integer = 1
            For Each rowItem As DataGridViewRow In Me.myDataGridView.Rows
                '行ヘッダの数字表示
                rowItem.HeaderCell.Value = count.ToString
                '背景色の着色
                rowItem.Cells(0).Style.BackColor = Color.LightBlue
                count += 1
            Next

        End Sub
    End Class
    ----------

    Friend Class MyData
        Private data As String
        Friend Sub New(ByVal p As String)
            Me.data = p
        End Sub
        Public ReadOnly Property getData()
            Get
                Return Me.data
            End Get
        End Property
    End Class

     

    #上記のソースには不可解な点があります。

    #DataSourceに設定するデータですが、Public ReadOnly Property getData()の値が表示されているのですが、

    #これをPublicからFriendに変更するとデータが表示できなくなってしまいます。

    #Publicは他のプロジェクトから参照するときに使うものだと思っています。

    #このプロパティは本プロジェクト内で使用するのでFriendでよいと思うのですが・・・・

     

    #私はよく、ソースのネーミングセンスがないと言われます。

    #あと、プログラムの話をするときの言葉の表現もおかしいときがあるとも・・・・。

    #もし、こうしたほうがいい、これはだめだよ、というものがありましたらご指導よろしくお願い致します。

     

     

     

    Visual Stadio 2005

    Visual Basic 2005

    .Net FrameWork2.0

    WindowsXP

    2008年10月15日 16:11

回答

  • こんにちは

     

    回避策ぐらいしか提案できないのですが。表示されていないTabPageはクリックされて初めてアクティブにされた場合にハンドルが作成されるため見えていないGridViewに対する色付けなどの操作が反映されないんだと思います。CreateControlを呼び出してもだめでした。また、下記のスレッドでも同じようなことが問題となっていました。

     

    GridView Image Problem...

    http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2438087&SiteID=1

     

    上記のサイトであるように、VisibleChangedイベントハンドラで初めてGridViewが表示されたときだけ、色づけや行番号の表示を行うでは対応できませんか?

     

     natu.s さんからの引用

    #上記のソースには不可解な点があります。

    #DataSourceに設定するデータですが、Public ReadOnly Property getData()の値が表示されているのですが、

    #これをPublicからFriendに変更するとデータが表示できなくなってしまいます。

    #Publicは他のプロジェクトから参照するときに使うものだと思っています。

    #このプロパティは本プロジェクト内で使用するのでFriendでよいと思うのですが・・・・

    上記アクセス修飾子の件ですが、DataGridViewのプロパティがどのようになっているのか分りませんが、たとえばAutoGenerateColumnsがtrueになっているとパブリックなプロパティから列を自動生成するため、Friendにすると表示されなくなるんだと思います。

     

    ネーミングルールに関しては人それぞれいろいろバックボーンがあるので、好みが分かれると思います。

    命名規約を作れば解決するかと。

    2008年10月16日 3:37

すべての返信

  • こんにちは

     

    回避策ぐらいしか提案できないのですが。表示されていないTabPageはクリックされて初めてアクティブにされた場合にハンドルが作成されるため見えていないGridViewに対する色付けなどの操作が反映されないんだと思います。CreateControlを呼び出してもだめでした。また、下記のスレッドでも同じようなことが問題となっていました。

     

    GridView Image Problem...

    http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2438087&SiteID=1

     

    上記のサイトであるように、VisibleChangedイベントハンドラで初めてGridViewが表示されたときだけ、色づけや行番号の表示を行うでは対応できませんか?

     

     natu.s さんからの引用

    #上記のソースには不可解な点があります。

    #DataSourceに設定するデータですが、Public ReadOnly Property getData()の値が表示されているのですが、

    #これをPublicからFriendに変更するとデータが表示できなくなってしまいます。

    #Publicは他のプロジェクトから参照するときに使うものだと思っています。

    #このプロパティは本プロジェクト内で使用するのでFriendでよいと思うのですが・・・・

    上記アクセス修飾子の件ですが、DataGridViewのプロパティがどのようになっているのか分りませんが、たとえばAutoGenerateColumnsがtrueになっているとパブリックなプロパティから列を自動生成するため、Friendにすると表示されなくなるんだと思います。

     

    ネーミングルールに関しては人それぞれいろいろバックボーンがあるので、好みが分かれると思います。

    命名規約を作れば解決するかと。

    2008年10月16日 3:37
  • すいません、遅くなりました。

    handcraft さんありがとうございました。

    とても参考になりました。

     

    おっしゃっていた通りForm1クラスに

    Privete viewFlg As Boolean = False

    を追加し、

    タブページ2上に配置されたデータグリッドビューのVisibleChangedイベントハンドラにて

    初めて表示されていた時のみ着色を行う処理を追加したらうまくいきました。

    本当にありがとうございました。

     

    #起動時にもイベントが動いてしまうのでフラグだけではなく、

    #インスタンスが生成されているか?という判定も追加しました。

    2008年10月27日 13:21