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

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

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

DataGridViewの列の背景色を切替えたい

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

■87482 / inTopicNo.1)  DataGridViewの列の背景色を切替えたい
  
□投稿者/ MTK (62回)-(2018/05/28(Mon) 15:32:41)

分類:[C#] 

お世話になります。

フォーム上に3つのDataGridViewが縦に並んでいます。
一番上のDataGridViewの1行目はチェックボックスセルになっており
そのセルをチェックした時に、チェックが入った列(縦に並ぶ3つのDataGridViewを含む)を
入力不可になるように設定をしています。

今回、入力不可のセルには見た目で入力不可が分かるように背景色をグレーにしたいと思っています。
チェックを外した時には元の背景色に戻したいのですが、
見やすいように奇数行と偶数行のセルの背景色を変えていることもあり、少々変更が面倒です。
今考えている方法ですと

@DataGridViewの背景色(奇数行と偶数行)を変数に格納しておく
Aチェックされたらループで回しながら3つのDataGridViewを1セルずつ背景色を変えていく(1列まとめて変更できないですよね?)
Bチェックが外されたら同様にループで回して変数に格納している背景色を適用する

上記のような方法になるかなと考えています。
見た目で 入力ができない というのが分かればいいので、半透明のグレーの四角形を上に被せるとかでもいいのですが。
何か良い方法や代替案などご存じでしょうか?
引用返信 編集キー/
■87484 / inTopicNo.2)  Re[1]: DataGridViewの列の背景色を切替えたい
□投稿者/ Hongliang (643回)-(2018/05/28(Mon) 16:05:59)
2018/05/28(Mon) 16:08:44 編集(投稿者)

私なら、
・DataGridViewのAlternatingRowsDefaultStyle.BackColorで偶数行の背景色を設定
・無効な列を指すDataGridColumnのDefaultCellStyle.BackColorを変更
・有効な列に戻すときはDataGridColumnのDefaultCellStyle.BackColorにColor.Emptyを設定
ぐらいで済ますと思います。

なおDataGridView.AlternatingRowsDefaultStyleの方がDataGridColumn.DefaultCellStyleより優先されるので、無効色に設定した時奇数行の背景色しか変わりませんが、上下行を見れば一目瞭然でしょう。
引用返信 編集キー/
■87485 / inTopicNo.3)  Re[2]: DataGridViewの列の背景色を切替えたい
□投稿者/ MTK (63回)-(2018/05/28(Mon) 16:37:53)
2018/05/28(Mon) 17:00:53 編集(投稿者)

No87484 (Hongliang さん) に返信

回答ありがとうございます。
1点伺いたいのですが、


> ・有効な列に戻すときはDataGridColumnのDefaultCellStyle.BackColorにColor.Emptyを設定

このDataGridColumnというのはどのように指定すれば良いのでしょうか?
1列丸々指定できる関数などが用意されているのでしょうか?


[追記]
すいません、見つかりました。
ありがとうございます。
引用返信 編集キー/
■87486 / inTopicNo.4)  Re[1]: DataGridViewの列の背景色を切替えたい
□投稿者/ 魔界の仮面弁士 (1690回)-(2018/05/28(Mon) 17:24:42)
No87482 (MTK さん) に返信
> 一番上のDataGridViewの1行目はチェックボックスセルになっており
> そのセルをチェックした時に、チェックが入った列(縦に並ぶ3つのDataGridViewを含む)を
> 入力不可になるように設定をしています。

その場合、チェックボックスセルは入力不可にしないのですよね。


using System;
using System.Drawing;
using System.Windows.Forms;

public partial class Form1 : Form
{
  private DataGridView dgvTop, dgvMiddle, dgvBottom;
  private readonly Color OddColorNormal = Color.PaleGoldenrod;
  private readonly Color EvenColorNormal = Color.PowderBlue;
  private readonly Color OddColorLocked = Color.Gainsboro;
  private readonly Color EvenColorLocked = Color.DarkGray;
  private readonly Color[] BackgroundColors;

  private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
  {
    // AlternatingRowsDefaultCellStyle に頼らず、自前で切り替え

    if (e.ColumnIndex < 0 || e.RowIndex < 0) { return; }
    if (sender == dgvTop && e.RowIndex == 0) { return; }
    int index = (bool)dgvTop[e.ColumnIndex, 0].Value ? 2 : 0;
    if (sender == dgvTop)
    {
      index += (e.RowIndex % 2 == 1) ? 0 : 1;
    }
    else
    {
      index += (e.RowIndex % 2 == 0) ? 0 : 1;
    }
    e.CellStyle.BackColor = BackgroundColors[index];
  }


  public Form1()
  {
    InitializeComponent();
    BackgroundColors = new Color[] { OddColorNormal, EvenColorNormal, OddColorLocked, EvenColorLocked };
    Controls.Clear();
    Controls.Add(dgvMiddle = new DataGridView() { Dock = DockStyle.Fill, TabIndex = 1 });
    Controls.Add(dgvTop = new DataGridView() { Dock = DockStyle.Top, TabIndex = 0 });
    Controls.Add(dgvBottom = new DataGridView() { Dock = DockStyle.Bottom, TabIndex = 2 });

    dgvTop.CellFormatting += dgv_CellFormatting;
    dgvMiddle.CellFormatting += dgv_CellFormatting;
    dgvBottom.CellFormatting += dgv_CellFormatting;

    dgvTop.ColumnCount = dgvMiddle.ColumnCount = dgvBottom.ColumnCount = 8;
    dgvTop.RowCount = dgvMiddle.RowCount = dgvBottom.RowCount = 50;
    for (int c = 0; c < dgvTop.ColumnCount; c++)
    {
      dgvTop[c, 0] = new DataGridViewCheckBoxCell(false) {
        TrueValue = true, FalseValue = false, Value = false,
        Style = { Alignment = DataGridViewContentAlignment.MiddleCenter}
      };
    }
    dgvTop.ColumnHeadersVisible = false;
    dgvTop.Rows[0].DefaultCellStyle = new DataGridViewCellStyle() {
      BackColor = SystemColors.Control,
      SelectionBackColor = SystemColors.Control
    };
    dgvTop.CurrentCell = dgvTop[0, 1];
    dgvTop.CurrentCellDirtyStateChanged += (sender, e) => {
      var cell = dgvTop.CurrentCell as DataGridViewCheckBoxCell;
      if (cell == null) { return; }
      var dgv = (DataGridView)sender;
      if (dgv.IsCurrentCellDirty) { dgv.CommitEdit(DataGridViewDataErrorContexts.Commit); }

      bool isReadOnly = (cell.TrueValue == cell.Value);
      int columnIndex = cell.ColumnIndex;
      for (int r = 1 ; r < dgvTop.RowCount; r++)
      {
        dgvTop[columnIndex, r].ReadOnly = isReadOnly;
      }
      for (int r = 0; r < dgvMiddle.RowCount; r++)
      {
        dgvMiddle[columnIndex, r].ReadOnly = isReadOnly;
      }
      for (int r = 0; r < dgvBottom.RowCount; r++)
      {
        dgvBottom[columnIndex, r].ReadOnly = isReadOnly;
      }
      dgvTop.InvalidateColumn(columnIndex);
      dgvMiddle.InvalidateColumn(columnIndex);
      dgvBottom.InvalidateColumn(columnIndex);
    };
  }
}
引用返信 編集キー/
■87487 / inTopicNo.5)  Re[2]: DataGridViewの列の背景色を切替えたい
□投稿者/ MTK (64回)-(2018/05/28(Mon) 18:48:32)
No87486 (魔界の仮面弁士 さん) に返信

回答ありがとうございます。
実際に単独で動くソースをいただけて大変助かります。


> その場合、チェックボックスセルは入力不可にしないのですよね。
はい、チェックボックスセルだけは例外です。


イベントで自前で描画しているんですね、なるほど〜!
毎度ですが、コードの書き方なども大変勉強になります。
このやり方で実装してみたいと思います。
ありがとうございました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ