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

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

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

Re[3]: DataGridViewのセルの背景色指定について


(過去ログ 141 を表示中)

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

■82670 / inTopicNo.1)  DataGridViewのセルの背景色指定について
  
□投稿者/ 山丸 (4回)-(2017/01/25(Wed) 18:27:05)

分類:[C#] 

お世話になります。
今回は、DataGridViewのセルの背景色指定についてお伺いいたします。
EXCELで、あるセル上で左クリックしてそのままマウスを移動した場合に
選択された範囲のセルがグレーになりますが、
これと同じようなことをDataGridViewでやりたいと思ってます。
参考になりそうなことがございましたらすみませんが、ご教示お願いします。
引用返信 編集キー/
■82671 / inTopicNo.2)  Re[1]: DataGridViewのセルの背景色指定について
□投稿者/ 魔界の仮面弁士 (1079回)-(2017/01/25(Wed) 19:24:23)
No82670 (山丸 さん) に返信
> EXCELで、あるセル上で左クリックしてそのままマウスを移動した場合に
ドラッグ操作の事だとしたら、マウス操作以外でも
[Shift]+[矢印キー] でも同様の表示になりますね。


> 選択された範囲のセルがグレーになりますが、
黒のセルだと黒いままなので、グレーと言うか、暗くなる動作かも。



> これと同じようなことをDataGridViewでやりたいと思ってます。
> 参考になりそうなことがございましたらすみませんが、ご教示お願いします。


とりあえず、背景色を動的に変更してみました。

public partial class Form1 : Form
{
  DataGridView dgv;
  public Form1()
  {
    InitializeComponent();
    dgv = new DataGridView();
    dgv.Dock = DockStyle.Fill;
    dgv.RowCount = 100;
    dgv.ColumnCount = 5;
    dgv.MultiSelect = true;
    Controls.Add(dgv);
    dgv.CellPainting += (sender, e) =>
    {
      var p = dgv.CurrentCellAddress;
      var q = new Point(e.ColumnIndex, e.RowIndex);
      var cs = e.CellStyle;
      if ( p!= q && e.State.HasFlag(DataGridViewElementStates.Selected))
      {
        cs.SelectionBackColor = Color.DarkGray;
        cs.SelectionForeColor = Color.Black;
      }
    };
  }
}


課題点


(1) DarkGray という固定色ではなく、現在の背景色に応じた「暗い色」を
 算出した方がそれっぽくなるかも。


(2) 複数選択時の「現在のセル位置」が、Excel と DataGridView では逆

Excel の場合、「ドラッグ開始位置のセル」が ActiveCell となるのに対し、
DataGridView は「カーソル位置/ドラッグ完了位置のセル」が CurrentCell となる。
引用返信 編集キー/
■82676 / inTopicNo.3)  Re[2]: DataGridViewのセルの背景色指定について
□投稿者/ 魔界の仮面弁士 (1083回)-(2017/01/26(Thu) 11:38:32)
No82671 (魔界の仮面弁士) に追記
> 課題点

もう一つありました。

Excel の場合、一つのセルが複数回選択されるケースがありますが、
もしもこれを再現するのなら、MultiSelect だけでは表現できませんので、
選択開始位置と選択完了位置を自己管理するしか無さそうです。


C3〜E5 の範囲をドラッグ選択

 ABCDEFG
1□□□□□□□
2□□□□□□□
3□□★○○□□  ★:アクティブセル
4□□○○○□□  ○:少し暗い色
5□□○○○□□
6□□□□□□□
7□□□□□□□


Ctrl を押しながら、B4〜F4 を追加選択

 ABCDEFG
1□□□□□□□
2□□□□□□□
3□□○○○□□  ★:アクティブセル
4□★◎◎◎○□  ○:少し暗い色
5□□○○○□□  ◎:暗い色
6□□□□□□□
7□□□□□□□


Ctrl を押しながら、さらに D2〜D6 を追加選択

 ABCDEFG
1□□□□□□□
2□□□★□□□  ★:アクティブセル
3□□○◎○□□  ○:少し暗い色
4□○◎●◎○□  ◎:暗い色
5□□○◎○□□  ●:さらに暗い色
6□□□◎□□□
7□□□□□□□

※VBA で言うと Range("C3:E5,B4:F4,D2:D6").Select な状態



暗い色を動的に作る件については、セルの色を HSL 変換してから
輝度(Lightness) 成分を下げてやればそれっぽくなる気がします。

ただし Color 構造体は、RGB 値にしか対応していないので、
RGB ←→ HSL 変換の処理も必要ですね。
(RGB → HSB/HSV なら用意されているのですが)

引用返信 編集キー/
■82681 / inTopicNo.4)  Re[3]: DataGridViewのセルの背景色指定について
□投稿者/ 山丸 (6回)-(2017/01/26(Thu) 15:33:34)
魔界の仮面弁士さま

回答いただきまして、ほんとにありがとうございます。
おかげ様でやりたいことを実現できました。
親切、丁寧なご教示に感謝いたします。

敬具
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -