teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

追記

2018/03/19 08:30

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -15,4 +15,93 @@
15
15
  - (C)最後のコード
16
16
  外観に影響を与えるプロパティーを変更しておらず、単にイベントオブジェクトの中にある「今回の描画における前景色、背景色を変更しているだけ」のためCellPaintingイベントが発生しません。
17
17
 
18
- 一般にイベントハンドラーの中でそのイベントが発生する原因になるようなことを再度行うのは避けるべきです。無限ループになってしまいますから。描画に関しては「外観に影響を及ぼす情報を変更するのは描画処理以外の場所ですべきこと」だと思ってください。
18
+ 一般にイベントハンドラーの中でそのイベントが発生する原因になるようなことを再度行うのは避けるべきです。無限ループになってしまいますから。描画に関しては「外観に影響を及ぼす情報を変更するのは描画処理以外の場所ですべきこと」だと思ってください。
19
+
20
+ ---
21
+ 追記:自分にも曖昧な点があるのでちょっと調べてみました。
22
+ ```C#
23
+ private Dictionary<object, string> dict = new Dictionary<object, string>();
24
+ private int idCount = 1;
25
+
26
+ private string id(object o) {
27
+ if (!dict.ContainsKey(o)) {
28
+ dict[o] = string.Format("#{0:X2}", idCount++);
29
+ }
30
+ return dict[o];
31
+ }
32
+ bool dumped=false;
33
+
34
+ private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) {
35
+ if (!dumped) {
36
+ foreach (DataGridViewRow row in dataGridView1.Rows) {
37
+ string s = "";
38
+ foreach (DataGridViewCell cc in row.Cells) {
39
+ s += $" [{cc.RowIndex,2:D},{cc.ColumnIndex,2:D}] Cell={id(cc)}/Cell.Style={id(cc.Style)}";
40
+ }
41
+ Console.WriteLine(s);
42
+ }
43
+ dumped = true;
44
+ }
45
+ int ri = e.RowIndex;
46
+ int ci = e.ColumnIndex;
47
+ Console.WriteLine($"[{ri,2:D}, {ci,2:D}] : CellStyle={id(e.CellStyle)}");
48
+ //e.CellStyle.ForeColor = Color.Black; //(D)
49
+ //e.CellStyle.BackColor = Color.Yellow; //(D)
50
+ //dataGridView1.DefaultCellStyle.ForeColor = Color.Red; //(E)
51
+ //dataGridView1.DefaultCellStyle.BackColor = Color.Blue;//(E)
52
+ }
53
+ ```
54
+ 上記を2x2のDataGridViewに対して動かすと初期画面描画時には次のようになりました。
55
+ 行・列のインデックスが-1になっているところは多分ヘッダー部分ではないかと想像します(ちゃんとわかってません)
56
+ 着目してほしいのはDataGridViewCellのStyleプロパティオブジェクトの値はEventArgのCellStyleオブジェクトと同一ではないという点です。
57
+ ```
58
+ [ 0, 0] Cell=#01/Cell.Style=#02 [ 0, 1] Cell=#03/Cell.Style=#02
59
+ [ 1, 0] Cell=#04/Cell.Style=#02 [ 1, 1] Cell=#05/Cell.Style=#02
60
+ [-1, -1] : CellStyle=#06
61
+ [-1, 0] : CellStyle=#06
62
+ [-1, 1] : CellStyle=#06
63
+ [ 0, -1] : CellStyle=#06
64
+ [ 0, 0] : CellStyle=#07
65
+ [ 0, 1] : CellStyle=#07
66
+ [ 1, -1] : CellStyle=#06
67
+ [ 1, 0] : CellStyle=#07
68
+ [ 1, 1] : CellStyle=#07
69
+ ```
70
+ (D)をアンコメントする(CellPainingの中でEventArgのCellStyleを変更する)と、
71
+ ```
72
+ [ 0, 0] Cell=#01/Cell.Style=#02 [ 0, 1] Cell=#03/Cell.Style=#02
73
+ [ 1, 0] Cell=#04/Cell.Style=#02 [ 1, 1] Cell=#05/Cell.Style=#02
74
+ [-1, -1] : CellStyle=#06
75
+ [-1, 0] : CellStyle=#07 <-
76
+ [-1, 1] : CellStyle=#07 <-
77
+ [ 0, -1] : CellStyle=#08 <-
78
+ [ 0, 0] : CellStyle=#09 <-
79
+ [ 0, 1] : CellStyle=#09 <-
80
+ [ 1, -1] : CellStyle=#0A <-
81
+ [ 1, 0] : CellStyle=#0B <-
82
+ [ 1, 1] : CellStyle=#0B <-
83
+ ```
84
+ さらに(E)をアンコメントする(CellPainingの中でDefaultCellStyleを変更する)と、
85
+ ```
86
+ [ 0, 0] Cell=#01/Cell.Style=#02 [ 0, 1] Cell=#03/Cell.Style=#02
87
+ [ 1, 0] Cell=#04/Cell.Style=#02 [ 1, 1] Cell=#05/Cell.Style=#02
88
+ [-1, -1] : CellStyle=#06
89
+ [-1, 0] : CellStyle=#07
90
+ [-1, 1] : CellStyle=#07
91
+ [ 0, -1] : CellStyle=#08
92
+ [ 0, 0] : CellStyle=#09
93
+ [ 0, 1] : CellStyle=#09
94
+ [ 1, -1] : CellStyle=#0A
95
+ [ 1, 0] : CellStyle=#0B
96
+ [ 1, 1] : CellStyle=#0B
97
+ [-1, -1] : CellStyle=#0C
98
+ [-1, 0] : CellStyle=#0D
99
+ [-1, 1] : CellStyle=#0D
100
+ [ 0, -1] : CellStyle=#0E
101
+ [ 0, 0] : CellStyle=#0F
102
+ [ 0, 1] : CellStyle=#0F
103
+ [ 1, -1] : CellStyle=#10
104
+ [ 1, 0] : CellStyle=#11
105
+ [ 1, 1] : CellStyle=#11
106
+ ```
107
+ こんな具合になります。上記結果を元の回答コメントに照らして考えてみるといかがでしょう?

2

表現不備修正

2018/03/19 08:30

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -15,4 +15,4 @@
15
15
  - (C)最後のコード
16
16
  外観に影響を与えるプロパティーを変更しておらず、単にイベントオブジェクトの中にある「今回の描画における前景色、背景色を変更しているだけ」のためCellPaintingイベントが発生しません。
17
17
 
18
- 一般にイベントハンドラーの中でそのイベントが発生する原因になるようなことは避けるべきです。無限ループになってしまいますから。描画に関しては「外観に影響を及ぼす情報を変更するのは描画処理以外の場所ですべきこと」だと思ってください。
18
+ 一般にイベントハンドラーの中でそのイベントが発生する原因になるようなことを再度行うのは避けるべきです。無限ループになってしまいますから。描画に関しては「外観に影響を及ぼす情報を変更するのは描画処理以外の場所ですべきこと」だと思ってください。

1

マークダウン訂正

2018/03/19 04:56

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  さて「今から自分自身を描画します」というイベント(本件ではCellPaintingイベントということになりましょうか)がいつ発生するかというと、理屈からいって「コントロールの外観に変化がおきるような変更が起こった時」ということになります。
4
4
 
5
- さて、DataGridViewのDefaultCellStyle.ForeColorはセルの前景色を意味するのでこの値が**変化すると自動的にCellPaintingイベントが発生し再描画が行われるようになっています。
5
+ さて、DataGridViewのDefaultCellStyle.ForeColorはセルの前景色を意味するのでこの値が**変化すると**自動的にCellPaintingイベントが発生し再描画が行われるようになっています。
6
6
 
7
7
  それを踏まえて・・・
8
8