|
■No57432 (赤いガチャピン さん) に返信
> データグリッドヴュー
「データグリッドビュー」もしくは「DataGridView」の方が一般的かと。
http://msdn.microsoft.com/ja-jp/library/x8ybe6s2%28VS.80%29.aspx
》 コンボ ボックスの値を変えると、『データグリッドビュー』も同じレコードに移動します。
> たしかに大量に個別設定をすると処理が遅くならないか心配でした。
> しかしセルごとにバックカラー、フォアカラーが変化するため個別でしかできないかなと・・・
では、遅くなってから考えましょう。(^^;
> ちなみにすべてのセルのスタイルを決定した後に全体にInheritedStyleプロパティを使うことってできるのでしょうか?
質問の意図が読み取れませんでしたが、InheritedStyle はそれぞれのセル(あるいは行や列)にありますので、
For ループ等で、全セルそれぞれのスタイルを InheritedStyle プロパティを使って読み取ることは可能でしょう。
それとも、最上位となる DataGridView 自身に InheritedStyle が見当たらないという意味だったのでしょうか。
(だとしたら、InheritedStyle プロパティと Style プロパティの違いを理解されていないのだと思われます)
> Me.DataGidView.DefaultCellStyle.SelectionBackColor = Me.DataGridView.CurrentCell.InheritedStyle.SelectionBackColor
> アクティブになっていないデータグリッドヴューだとエラーになってしまいました。
どんなエラーなのかぐらいは書きましょうよ。(^^;
InvalidOperationException なのか NullReferenceException なのかとか。
仮に NullReferenceException だとしたら、どのオブジェクトが Nothing なのかを確認してみてください。
Me や InheritedStyle や DefaultCellStyle が Nothing を返すことはありえないので、
Nothing になっているとすれば、CurrentCell が一番怪しいでしょう。
たとえばデータを表示する前の段階だと、CurrentCellAddress は (-1, -1) になりますし、
CurrentCell も Nothing の状態です。ですから、CurrentCell の Nothing 判定も必要かと。
> Me.DataGidView.DefaultCellStyle.SelectionBackColor = Me.DataGridView.CurrentCell.InheritedStyle.SelectionBackColor
ごめんなさい。コードの意図を読み取れませんでした…。
このコードを実行する事で、どのような結果を期待しておられるのでしょうか。
上記コードの動作について、具体例を挙げて追いかけてみましょう。
まず、SelectionBackColor が下記のように設定されていたとします。
DataGidView1.DefaultCellStyle.SelectionBackColor = 赤
├DataGidView1.Columns(0).DefaultCellStyle = Nothing(個別スタイル設定なし)
└DataGidView1.Columns(1).DefaultCellStyle.SelectionBackColor = 黄
└DataGidView1.RowsDefaultCellStyle = Nothing(個別スタイル設定なし)
└DataGidView1.AlternatingRows.DefaultCellStyle.SelectionBackColor = 緑
├DataGidView1.Rows(1).DefaultCellStyle.SelectionBackColor = Empty(親色を継承)
│└DataGidView1(1, 1).Style.SelectionBackColor = 青
├DataGidView1.Rows(3).DefaultCellStyle.SelectionBackColor = Empty(親色を継承)
├DataGidView1.Rows(4).DefaultCellStyle = Nothing(個別スタイル設定なし)
│├DataGidView1(0, 4).Style.SelectionBackColor = Empty(親色を継承)
│└DataGidView1(1, 4).Style.SelectionBackColor = 茶
└DataGidView1.Rows(5).DefaultCellStyle.SelectionBackColor = 紫
この場合、.CurrentCell.InheritedStyle.SelectionBackColor から返される色というのは、
それぞれの .CurrentCellAddress に対して以下の色を返します。
セル (0, 1) は『緑』 (セル0-1は未設定→行1は親継承→奇数行の「緑」を利用)
セル (1, 1) は『青』 (セル1-1の「青」を利用)
セル (0, 2) は『赤』 (セル0-2は未設定→行2は未設定→全体行は未設定→列0は未設定→全体設定の「赤」を利用)
セル (1, 2) は『黄』 (セル1-2は未設定→行2は未設定→全体行は未設定→列1の「黄」を利用)
セル (0, 3) は『緑』 (セル0-3は未設定→行3は親継承→奇数行の「緑」を利用)
セル (1, 3) は『緑』 (セル1-3は未設定→行3は親継承→奇数行の「緑」を利用)
セル (0, 4) は『赤』 (セル0-4や親継承→行4は未設定→全体行は未設定→列0は未設定→全体設定の「赤」を利用)
セル (1, 4) は『茶』 (セル1-4の「茶」を利用)
セル (0, 5) は『紫』 (セル0-5は未設定→行5の「紫」を利用)
セル (1, 5) は『紫』 (セル1-5は未設定→行5の「紫」を利用)
Public Class Form1
Private WithEvents dgv As New DataGridView() With {.Dock = DockStyle.Fill}
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
Controls.Add(dgv)
dgv.AllowUserToAddRows = False
dgv.RowCount = 7
dgv.ColumnCount = 3
For y = 0 To 6
For x = 0 To 2
dgv(x, y).Value = String.Format("{0}-{1}", x, y)
Next
Next
dgv.DefaultCellStyle.SelectionBackColor = Color.Salmon
dgv.Columns(1).DefaultCellStyle.SelectionBackColor = Color.Gold
dgv.RowsDefaultCellStyle = Nothing
dgv.AlternatingRowsDefaultCellStyle.SelectionBackColor = Color.LightGreen
dgv.Rows(1).DefaultCellStyle.SelectionBackColor = Color.Empty
dgv.Rows(3).DefaultCellStyle.SelectionBackColor = Color.Empty
dgv.Rows(4).DefaultCellStyle = Nothing
dgv.Rows(5).DefaultCellStyle.SelectionBackColor = Color.BlueViolet
dgv(0, 4).Style.SelectionBackColor = Color.Empty
dgv(1, 4).Style.SelectionBackColor = Color.SaddleBrown
dgv(1, 1).Style.SelectionBackColor = Color.RoyalBlue
End Sub
Private Sub dgv_CellEnter(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles dgv.CellEnter
Dim c = dgv(e.ColumnIndex, e.RowIndex)
Text = String.Format("({0}, {1}) ", e.ColumnIndex, e.RowIndex) _
& If(c.HasStyle, If(c.Style.SelectionBackColor = Color.Empty, "親継承", "設定有"), "未設定") _
& c.InheritedStyle.SelectionBackColor.ToString()
End Sub
End Class
ここまではよろしいでしょうか。
このあと、『青』を返すセル (1, 1) を選択中に
> Me.DataGidView.DefaultCellStyle.SelectionBackColor = Me.DataGridView.CurrentCell.InheritedStyle.SelectionBackColor
の処理を実行した場合、全体設定が「赤」から『青』に書き換わりますよね。
このとき、各セルの選択色は下記のように変更されることになります。
あまり意味のあるコードとは思えませんが…。
セル (0, 1) は『緑』のまま (全体設定よりも、奇数行の「緑」が優先される)
セル (1, 1) は『青』のまま (全体設定も青になったが、その前にセル1-1の「青」が優先されている)
セル (0, 2) は『青』に変更 (全体設定が「赤」から『青』に変わったため)
セル (1, 2) は『黄』のまま (全体設定よりも、列1の「黄」が優先される)
セル (0, 3) は『緑』のまま (全体設定よりも、奇数行の「緑」が優先される)
セル (1, 3) は『緑』のまま (全体設定よりも、奇数行の「緑」が優先される)
セル (0, 4) は『青』に変更 (全体設定が「赤」から『青』に変わったため)
セル (1, 4) は『茶』のまま (全体設定よりも、セル1-4の「茶」が優先される)
セル (0, 5) は『紫』のまま (全体設定よりも、行5の「紫」が優先される)
セル (1, 5) は『紫』のまま (全体設定よりも、行5の「紫」が優先される)
|