回答の候補 DataGridView のセルの背景色の取得と設定

  • 2010年5月15日 11:29
     
     

    DataGridView のセルの背景色の取得と設定方法について教えて下さい。

    特定の行を設定する方法については、

    DataGridView.RowEnter Event(http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.rowenter.aspx)

    で設定できることは分かったのですが、

    設定されている背景色の取得方法と、いっぺんにすべてのセルの背景色を設定する方法が分かりません。

    どうぞ、よろしくお願いいたします。

すべての返信

  • 2010年5月15日 11:59
     
     回答の候補

    RowEnter …ですか? これは、今選択中の行の状態を変更するのに使うものですが、それでいいんでしょうか? 「いっぺんにすべてのセル」ってのは、選択中かどうかを気にせずというニュアンスが感じられますが。

    DataGridView の全てのセルの既定のスタイルを変更するには、DataGridView.DefaultCellStyle プロパティを使用できます。

    また実際に適用されているスタイルの取得方法については、Windows フォーム DataGridView コントロールでのセルのスタイル に記述があります。

  • 2010年5月15日 12:44
     
     

    またしても、説明が悪くて申し訳ありません。

    また、dataGridView1.DefaultCellStyle.BackColor = Color.Yellow;

    という方法で、すべてのセルの背景色を設定することができました。ありがとうございます。

    RowEnter ... で特定行の背景色の設定方法を設定することが出来たとの内容は、

    このようにすると、特定行のセルカラーを設定することが出来るのだな、という参考文書であり、これによって、全セルではなく特定(1次元)のセルの設定方法については、勉強していますという内容でしかありませんの(余計な内容だったかもしれませんが)。また、この方法を知ることができた私が、まさか for を回してRow と Column とを i と j とで設定すればよいのは分かりますけれど、もっとよい方法はないだろうか、という確認でした(回りくどかったかも知れません)。

    もう一つの質問は、

    現在設定されているセルの背景色の取得方法についての確認です。

    これは、私の能力不足のため、どうやったら例えば変数に取得できるのかが分からないのです。これは、ご紹介いただいた「記述があります」との内容を見ても分からないままです。申し訳ありません、もうちょい「この方法」というのを絞ってご教授願えないでしょうか?

    まず、セル全体のデフォルトカラーを取得する方法が分かっていません(BackgroundColorはAppWorkSpace とデザイナに書いてありますがこれを取得する方法さえ分かっていません)。

    直接の目的は、上記のfor 文で設定した特定行の背景色を元のデフォルトカラーに戻すにあたり、特定行のみの背景色を元に戻すのが特定行を取得する操作に手間がかかってしまうので、その手間を省いて一気にセル全体の背景色をを元に戻したいからなのです。かなり単純な目的ではあります。

    ぜひ、よろしくお願いいたします。

    • 編集済み yasheeki 2010年5月15日 13:04 説明不足の補足
    • 編集済み yasheeki 2010年5月15日 14:25 目的追加
    •  
  • 2010年5月15日 14:45
     
     

    先の「Windows フォーム DataGridView コントロールでのセルのスタイル」ページを読めば、あるセルのスタイルが、DataGridView の DefaultCellStyle、カラムの DefaultCellStyle、RowsDefaultCellStyle、…と継承され上書きされて最終的なスタイルの値が求められる、というのはお分かりだと思います。そして、その最終的にどのプロパティがこの継承チェーンの末端なのかも。

    DataGridView のセルは DataGridViewCell クラスで表現されていますが、特定のセルの DataGridViewCell の取得は大丈夫ですよね?

    これらの情報で、そのセルがどんなスタイルなのかは取得できますよね。

    で、セル全体のデフォルトカラー? ですか? DataGridView の DefaultCellStyle から取得できると思いますが。AppWorkspace ってことはむしろセルが存在していない部分の背景色? それなら DataGridView の BackgroundColor プロパティですが……これはセルの色とは一切関係ないですよ。

  • 2010年5月16日 6:25
     
     

    回答ありがとうございます。

    >これらの情報で、そのセルがどんなスタイルなのかは取得できますよね。

    ということですが、うまくいきませんので、ためしに書いたコードを提示させていただきます。まず、

            private Color defaultCellBackColor;


    を、宣言し、クリックイベントのメソッドの中で、

                    dataGridView1.DefaultCellStyle.BackColor = dataGridView1.RowsDefaultCellStyle.BackColor;
                    for (int i = 0; i < dataGridView1.Columns.Count; i++)
                        dataGridView1[i, iPos].Style.BackColor = Color.Yellow;

    と、すべてのセル背景色をいったんデフォルトのカラーにしたうえで、クリックされたセルの行の背景色だけを着色しようとしましたが、こんなコードでは違う行をクリックする度に、もとのセルの背景色が黄色になったまで、どんどん黄色の行が増えていくだけです。

    どうすべきところでしょうか?

  • 2010年5月17日 3:38
     
     

    まず、DataGridView には2種類の色設定があるということを理解する必要がありますね。

    1つめは、「グリッドの状態に応じて設定される色」です。これは、他の方が書かれている DefaultCellStyle 等によって設定されている色で、DataGirdView はこれらの設定に従った色を自動的に割りつけてくれます。

    たとえば、デフォルトの状態で DataGridView を配置すると、選択中のセルに含まれるすべてのセルはハイライト色に変更され、行を選択すると行全体がハイライト色になったり、選択中のセルを変更すると自動的にハイライト色の部分が移動します。これは、DataGridView が「選択中」という状態に対してハイライト色を設定しているためです。

    これに対して、2つめの色設定は「開発者が個別に行う色設定」で、行やセルの Style プロパティを使ったものです。こちらを使用された行やセルは、指定された色で必ず描画されます

    いいかえれば、後者はセルや行に色を直接指定しているのに対し、前者は「色の指定がない場合」にどのような色になるかというルールを定義しているわけです。

    以上を踏まえると、

    > すべてのセル背景色をいったんデフォルトのカラーにしたうえで、

    という部分に問題があることがわかりますでしょうか? コーディングされた内容では、「色設定がない場合」の色を設定しているだけで、色を設定してるわけではないのです。よって、黄色に直接設定された行が増え続けることになります。

    最後にクリックされた1行だけを黄色にしたい場合、「すでに黄色に設定した行」を元の色に戻してあげる必要があります。もしくは、クリックされた行が選択状態になることを利用しても良いようであれば「選択行の色」を黄色にすることで、すべてのセルを色指定なしのままにすることもできるかもしれません。

     

  • 2010年5月17日 14:39
     
      コードあり

    丁寧な解説をありがとうございます。

    > 「色設定がない場合」の色を設定

    しても、希望の通りにならないのが分かりました。

    そこで、初心に帰って、以下のコードをセル選択のイベントに入れてみました(iPos は、選択された行を指しています)。

            for (int i = 0; i < dataGridView1.Columns.Count; i++)
            {
              for (int j = 0;j<dataGridView1.Rows.Count;j++)
                dataGridView1[i, j].Style.BackColor = Color.WhiteSmoke;
            }
            for (int i = 0; i < dataGridView1.Columns.Count; i++)
              dataGridView1[i, iPos].Style.BackColor = Color.Yellow;
    

    これで、思ったものに近い処理ができるようになります。

    ただ、これではきっと処理が遅すぎるのではないかという危惧があります。アプリとしては、データ行数が多くなったときの処理速度がネックになりそうです。

    そこで、すべてのセルを一気に指定の色(この場合、WhiteSmoke です)にする方法はないでしょうか?本当は、WhiteSmoke ではなく、Visual Studio 2008 所定の既定色にしたいと思っています。

    そんな方法が元々ないのかどうか、出来るとしたらどんな方法かを教えていただけないでしょうか?