質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.78%

複数タブ内それぞれにあるDataGridViewの背景色の変更が上手くいかない

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 604

score 8

前提・実現したいこと

C# WindowsアプリケーションでDataGridViewの1行目に合計行を作り合計行の
セル背景色を変更する処理を作っています。
DataGridViewはタブコントロール内の2つのタブそれぞれに存在します。
データ検索時にそれぞれのタブ内にあるDataGridViewにDatasourceに別々のデータを
バインドし、最後に先頭行(合計行)の背景色を変更する処理にしています。

問題点

アクティブなタブ内のDataGridViewの合計行の背景色は変更されるのですが、
アクティブではないタブ内のDataGridViewの合計行の背景色が変更されません。

試したこと

タブのSelectedIndexChangedイベント発生時にアクティブになるタブ内のDataGridViewの
合計行の背景色を変更したらうまくいきました。
(なるべくなら検索時に見た目の処理も行いたいです)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • YAmaGNZ

    2020/08/11 16:01

    どのようにして背景色を変更しているのですか?

    キャンセル

  • tttbbb

    2020/08/12 08:14 編集

    以下のコードで背景色を変更しております。

    dgv.Rows[0].DefaultCellStyle.BackColor = Color.LightBlue;

    キャンセル

  • YAmaGNZ

    2020/08/12 09:05

    それをどのタイミングで行っているのですか?

    キャンセル

  • YAmaGNZ

    2020/08/12 09:18

    言葉で説明されても行き違いが発生する可能性があるので、再現できるソースの提示をお願いします。

    キャンセル

回答 2

checkベストアンサー

0

下記ソースにて仰っているであろう現象が再現しました。
ただ、何故このような現象が発生するかという部分に関しては追いきれていませんが実際に表示が行われるタイミングでスタイルがリセットされているように感じます。

下記ではSelectedIndexChangedイベントにてセルのスタイルを再設定して表示は正常になっています。
また、DataGridViewのRowPrePaintにて0行目の描画の場合はスタイル再設定を行うようにしても現象を抑えることができました。

public partial class Form1 : Form
{
    TabControl tabControl1 = new TabControl() { Dock = DockStyle.Fill };
    TabPage tabPage1 = new TabPage() { Name = "page1", Text = "Page1" };
    TabPage tabPage2 = new TabPage() { Name = "page2", Text = "Page2" };
    DataGridView dataGridView1 = new DataGridView() { Dock = DockStyle.Fill };
    DataGridView dataGridView2 = new DataGridView() { Dock = DockStyle.Fill };

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

        this.Controls.Add(tabControl1);

        tabControl1.Controls.Add(tabPage1);
        tabControl1.Controls.Add(tabPage2);

        tabPage1.Controls.Add(dataGridView1);
        tabPage2.Controls.Add(dataGridView2);

        DataTable dt = new DataTable();
        dt.Columns.Add("Column1");
        dt.Columns.Add("Column2");
        dt.Columns.Add("Column3");

        dt.Rows.Add("total", "total", "total");
        dt.Rows.Add("aaa", "aaaa", "aaaaa");
        dt.Rows.Add("aaa", "aaaa", "aaaaa");
        dt.Rows.Add("aaa", "aaaa", "aaaaa");

        dataGridView1.DataSource = dt;
        dataGridView1.Rows[0].DefaultCellStyle.BackColor = Color.LightBlue;

        dataGridView2.DataSource = dt;
        dataGridView2.Rows[0].DefaultCellStyle.BackColor = Color.LightBlue;

        // この時点では背景色はLightBlueだが、タブを切り替えるとSystemColor.Windowとなる。
        Console.WriteLine($"dataGridView2[0,0] = {dataGridView2[0, 0].InheritedStyle.BackColor}");


        tabControl1.SelectedIndexChanged += (s, ev) => {
            if (tabControl1.SelectedIndex == 1)
            {
                // この時点でSystemColor.Window
                Console.WriteLine($"dataGridView2[0,0] = {dataGridView2[0, 0].InheritedStyle.BackColor}");
                dataGridView2.Rows[0].DefaultCellStyle.BackColor = Color.LightBlue;
                Console.WriteLine($"dataGridView2[0,0] = {dataGridView2[0, 0].InheritedStyle.BackColor}");
            }
        };

    }

}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/08/12 12:20

    バグなのか仕様なのかよくわかりませんが^^;

    DataGridView#DataBindingComplete

    DataGridView#CellFormatting
    で対応している例も見受けられました。

    キャンセル

  • 2020/08/12 13:37

    YAmaGNZ様
    詳細なソース&情報ありがとうございます!
    頂いた情報を元にDataGridViewのRowPrePaint等々、色々試してみます。
    迅速なご返信ありがとうございました。

    キャンセル

  • 2020/08/12 13:39

    TN8001様
    他の方々も同じように苦労されてるんですね。。。
    私の検索では同じ様な方々の情報を見つけられませんでしたが、
    頂いたイベントでのやり方も調べて試してみます!
    ありがとうございました。

    キャンセル

0

はずれかもしれませんが、下記でどうでしょうか?
dgv.Invalidate();

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る