C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: DataGridViewで透明色のエラーを回避する方法


(過去ログ 96 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■57407 / inTopicNo.1)  DataGridViewで透明色のエラーを回避する方法
  
□投稿者/ 赤いガチャピン (5回)-(2011/02/25(Fri) 12:12:27)

分類:[.NET 全般] 

Win7でVB2010で作成しています

DataGridViewで選択中のバックカラーと文字カラーを透明色にしたくて
表示プロパティのDefaultCellStyleでSelectionBackColorとSelectionForeColorを
それぞれTransparentに設定したのですが、そのデータグリッドヴューがあるページを表示したときに
表示する前のページの項目が、はじめから選択されているセルに映ってしまう現象が発生してしまいました。

また、フォームのサイズを変更して選択されているセルが隠れてしまうと
再度サイズを戻して表示したときには同じような現象が起きます。

このエラーを回避する方法をどなたかご教授していただけませんでしょうか?
よろしくお願いいたします。

なお、条件として セルは選択できる状態にしておきたい セルにソート用の文字列があるので(白文字で999とか)
選択したときには透明色にしたい です。
引用返信 編集キー/
■57411 / inTopicNo.2)  Re[1]: DataGridViewで透明色のエラーを回避する方法
□投稿者/ 魔界の仮面弁士 (2103回)-(2011/02/25(Fri) 13:37:50)
No57407 (赤いガチャピン さん) に返信
> DataGridViewで選択中のバックカラーと文字カラーを透明色にしたくて

「選択しても、通常の背景色/文字色のまま色が変わらないようにしたい」
という意味なら、Transparent を指定するのではなく、
通常の色を選択色に指定すれば良い気がしますが…そういうことではないのかな?


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 = 5
        dgv.ColumnCount = 3
        For y = 0 To 4
            For x = 0 To 2
                dgv(x, y).Value = String.Format("{0}-{1}", x, y)
            Next
        Next
        dgv.Columns(1).DefaultCellStyle.BackColor = Color.DarkSalmon

        Dim cell As DataGridViewCell

        '透明色
        cell = dgv(1, 1)
        cell.Style.SelectionBackColor = Color.Transparent
        cell.Style.SelectionForeColor = Color.Transparent

        '通常色と同じ色
        cell = dgv(1, 3)
        cell.Style.SelectionBackColor = cell.InheritedStyle.BackColor
        cell.Style.SelectionForeColor = cell.InheritedStyle.ForeColor

        dgv.CurrentCell = dgv(1, 1)
        dgv.Columns(1).Selected = True
    End Sub
End Class

引用返信 編集キー/
■57427 / inTopicNo.3)  Re[2]: DataGridViewで透明色のエラーを回避する方法
□投稿者/ 赤いガチャピン (6回)-(2011/02/25(Fri) 21:30:51)
No57411 (魔界の仮面弁士 さん) に返信
> ■No57407 (赤いガチャピン さん) に返信
>>DataGridViewで選択中のバックカラーと文字カラーを透明色にしたくて
>
> 「選択しても、通常の背景色/文字色のまま色が変わらないようにしたい」
> という意味なら、Transparent を指定するのではなく、
> 通常の色を選択色に指定すれば良い気がしますが…そういうことではないのかな?
>
魔界の仮面弁士さん回答ありがとうございます。

セレクションバックカラー等を全体的なセルでしか設定できないものだと思っておりました。
セルごとにその都度バックカラー等同じものを設定すればできそうです。

InheritedStyleというプロパティは知りませんでしたのでいい勉強になりました。ありがとうございます。

解決済み
引用返信 編集キー/
■57429 / inTopicNo.4)  Re[3]: DataGridViewで透明色のエラーを回避する方法
□投稿者/ 魔界の仮面弁士 (2107回)-(2011/02/25(Fri) 22:31:42)
No57427 (赤いガチャピン さん) に返信
> セレクションバックカラー等を全体的なセルでしか設定できないものだと思っておりました。
DataGridView のスタイルは、以下の単位で設定できます。
 「全体」
 「行ヘッダ」
 「列ヘッダ」
 「列全体」
 「行全体」
 「奇数行」
 「セル個別」
http://msdn.microsoft.com/ja-jp/library/1yef90x0%28VS.80%29.aspx

これらは継承関係にあり、.HasStyle = False の場合は親のスタイルが使われます。
また、.Style.Font = Nothing や .Style.BackColor = Color.Empty などとして、
「背景色とフォントは親スタイルで、文字色だけ個別設定」のような事もできます。


> セルごとにその都度バックカラー等同じものを設定すればできそうです。
大量に個別設定すると、パフォーマンス上の問題を生じます。
可能な限り、上位のスタイル(列単位など)で設定するようにしてください。

もしもセルが連続していない場合でも、それぞれのセルのスタイルが同じ設定の場合は、
DataGridViewCellStyle 型の変数を用意し、それを Style に渡すようにします(設定の共有)。

また、スタイルがデータの内容に依存する場合(たとえば、マイナス値を赤くするなど)には、
CellFormatting や CellPainting などでイベント処理した方が良いでしょう。


余力があれば、このあたりも読んでおくと良いかも。
http://msdn.microsoft.com/ja-jp/library/ha5xt0d9%28VS.80%29.aspx
解決済み
引用返信 編集キー/
■57432 / inTopicNo.5)  Re[4]: DataGridViewで透明色のエラーを回避する方法
□投稿者/ 赤いガチャピン (7回)-(2011/02/26(Sat) 09:40:28)
No57429 (魔界の仮面弁士 さん) に返信
> ■No57427 (赤いガチャピン さん) に返信
> 大量に個別設定すると、パフォーマンス上の問題を生じます。
> 可能な限り、上位のスタイル(列単位など)で設定するようにしてください。

魔界の仮面弁士さん 参考資料ありがとうございます。
たしかに大量に個別設定をすると処理が遅くならないか心配でした。
しかしセルごとにバックカラー、フォアカラーが変化するため個別でしかできないかなと・・・

ちなみにすべてのセルのスタイルを決定した後に全体にInheritedStyleプロパティを使うことってできるのでしょうか?
Me.DataGidView.DefaultCellStyle.SelectionBackColor = Me.DataGridView.CurrentCell.InheritedStyle.SelectionBackColor
にしてみたのですがアクティブになっていないデータグリッドヴューだとエラーになってしまいました。(タブにより複数のデータグリッドヴューを使用しています)

イベント処理は一瞬ちらつきがみられるためできれば避けたいです

お手数をおかけいたしますがよろしくお願いいたします。
引用返信 編集キー/
■57433 / inTopicNo.6)  Re[5]: DataGridViewで透明色のエラーを回避する方法
□投稿者/ 魔界の仮面弁士 (2109回)-(2011/02/26(Sat) 11:28:44)
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の「紫」が優先される)

引用返信 編集キー/
■57438 / inTopicNo.7)  Re[6]: DataGridViewで透明色のエラーを回避する方法
□投稿者/ 赤いガチャピン (8回)-(2011/02/26(Sat) 13:56:10)
No57433 (魔界の仮面弁士 さん) に返信
> ■No57432 (赤いガチャピン さん) に返信

魔界の仮面弁士さん回答ありがとうございます

>>ちなみにすべてのセルのスタイルを決定した後に全体にInheritedStyleプロパティを使うことってできるのでしょうか?
> 質問の意図が読み取れませんでしたが、InheritedStyle はそれぞれのセル(あるいは行や列)にありますので、
> For ループ等で、全セルそれぞれのスタイルを InheritedStyle プロパティを使って読み取ることは可能でしょう。
>
> それとも、最上位となる DataGridView 自身に InheritedStyle が見当たらないという意味だったのでしょうか。
> (だとしたら、InheritedStyle プロパティと Style プロパティの違いを理解されていないのだと思われます)

理解していませんでした。m(__)m

>>Me.DataGidView.DefaultCellStyle.SelectionBackColor = Me.DataGridView.CurrentCell.InheritedStyle.SelectionBackColor
>>アクティブになっていないデータグリッドヴューだとエラーになってしまいました。
> どんなエラーなのかぐらいは書きましょうよ。(^^;

NullReferenceException でした。

>>Me.DataGidView.DefaultCellStyle.SelectionBackColor = Me.DataGridView.CurrentCell.InheritedStyle.SelectionBackColor
に関して私が勘違いしていました。再度試したら期待と違う処理がされました。わかりやすいご説明ありがとうございました。

この質問にたいして大変な手間を掛けていただきありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -