トップ回答者
TabControl-TabPage内のDataGridView、Cellの背景色が着色できない。

質問
-
こんばんわ。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 SubPrivate 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 DataGridViewFriend 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 = dataArrayDim 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
NextEnd 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
回答
-
こんにちは
回避策ぐらいしか提案できないのですが。表示されていない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にすると表示されなくなるんだと思います。
ネーミングルールに関しては人それぞれいろいろバックボーンがあるので、好みが分かれると思います。
命名規約を作れば解決するかと。
すべての返信
-
こんにちは
回避策ぐらいしか提案できないのですが。表示されていない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にすると表示されなくなるんだと思います。
ネーミングルールに関しては人それぞれいろいろバックボーンがあるので、好みが分かれると思います。
命名規約を作れば解決するかと。
-
すいません、遅くなりました。
handcraft さんありがとうございました。
とても参考になりました。
おっしゃっていた通りForm1クラスに
Privete viewFlg As Boolean = False
を追加し、
タブページ2上に配置されたデータグリッドビューのVisibleChangedイベントハンドラにて
初めて表示されていた時のみ着色を行う処理を追加したらうまくいきました。
本当にありがとうございました。
#起動時にもイベントが動いてしまうのでフラグだけではなく、
#インスタンスが生成されているか?という判定も追加しました。