回答編集履歴

3

追記

2018/03/19 08:30

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -33,3 +33,181 @@
33
33
 
34
34
 
35
35
  一般にイベントハンドラーの中でそのイベントが発生する原因になるようなことを再度行うのは避けるべきです。無限ループになってしまいますから。描画に関しては「外観に影響を及ぼす情報を変更するのは描画処理以外の場所ですべきこと」だと思ってください。
36
+
37
+
38
+
39
+ ---
40
+
41
+ 追記:自分にも曖昧な点があるのでちょっと調べてみました。
42
+
43
+ ```C#
44
+
45
+ private Dictionary<object, string> dict = new Dictionary<object, string>();
46
+
47
+ private int idCount = 1;
48
+
49
+
50
+
51
+ private string id(object o) {
52
+
53
+ if (!dict.ContainsKey(o)) {
54
+
55
+ dict[o] = string.Format("#{0:X2}", idCount++);
56
+
57
+ }
58
+
59
+ return dict[o];
60
+
61
+ }
62
+
63
+ bool dumped=false;
64
+
65
+
66
+
67
+ private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) {
68
+
69
+ if (!dumped) {
70
+
71
+ foreach (DataGridViewRow row in dataGridView1.Rows) {
72
+
73
+ string s = "";
74
+
75
+ foreach (DataGridViewCell cc in row.Cells) {
76
+
77
+ s += $" [{cc.RowIndex,2:D},{cc.ColumnIndex,2:D}] Cell={id(cc)}/Cell.Style={id(cc.Style)}";
78
+
79
+ }
80
+
81
+ Console.WriteLine(s);
82
+
83
+ }
84
+
85
+ dumped = true;
86
+
87
+ }
88
+
89
+ int ri = e.RowIndex;
90
+
91
+ int ci = e.ColumnIndex;
92
+
93
+ Console.WriteLine($"[{ri,2:D}, {ci,2:D}] : CellStyle={id(e.CellStyle)}");
94
+
95
+ //e.CellStyle.ForeColor = Color.Black; //(D)
96
+
97
+ //e.CellStyle.BackColor = Color.Yellow; //(D)
98
+
99
+ //dataGridView1.DefaultCellStyle.ForeColor = Color.Red; //(E)
100
+
101
+ //dataGridView1.DefaultCellStyle.BackColor = Color.Blue;//(E)
102
+
103
+ }
104
+
105
+ ```
106
+
107
+ 上記を2x2のDataGridViewに対して動かすと初期画面描画時には次のようになりました。
108
+
109
+ 行・列のインデックスが-1になっているところは多分ヘッダー部分ではないかと想像します(ちゃんとわかってません)
110
+
111
+ 着目してほしいのはDataGridViewCellのStyleプロパティオブジェクトの値はEventArgのCellStyleオブジェクトと同一ではないという点です。
112
+
113
+ ```
114
+
115
+ [ 0, 0] Cell=#01/Cell.Style=#02 [ 0, 1] Cell=#03/Cell.Style=#02
116
+
117
+ [ 1, 0] Cell=#04/Cell.Style=#02 [ 1, 1] Cell=#05/Cell.Style=#02
118
+
119
+ [-1, -1] : CellStyle=#06
120
+
121
+ [-1, 0] : CellStyle=#06
122
+
123
+ [-1, 1] : CellStyle=#06
124
+
125
+ [ 0, -1] : CellStyle=#06
126
+
127
+ [ 0, 0] : CellStyle=#07
128
+
129
+ [ 0, 1] : CellStyle=#07
130
+
131
+ [ 1, -1] : CellStyle=#06
132
+
133
+ [ 1, 0] : CellStyle=#07
134
+
135
+ [ 1, 1] : CellStyle=#07
136
+
137
+ ```
138
+
139
+ (D)をアンコメントする(CellPainingの中でEventArgのCellStyleを変更する)と、
140
+
141
+ ```
142
+
143
+ [ 0, 0] Cell=#01/Cell.Style=#02 [ 0, 1] Cell=#03/Cell.Style=#02
144
+
145
+ [ 1, 0] Cell=#04/Cell.Style=#02 [ 1, 1] Cell=#05/Cell.Style=#02
146
+
147
+ [-1, -1] : CellStyle=#06
148
+
149
+ [-1, 0] : CellStyle=#07 <-
150
+
151
+ [-1, 1] : CellStyle=#07 <-
152
+
153
+ [ 0, -1] : CellStyle=#08 <-
154
+
155
+ [ 0, 0] : CellStyle=#09 <-
156
+
157
+ [ 0, 1] : CellStyle=#09 <-
158
+
159
+ [ 1, -1] : CellStyle=#0A <-
160
+
161
+ [ 1, 0] : CellStyle=#0B <-
162
+
163
+ [ 1, 1] : CellStyle=#0B <-
164
+
165
+ ```
166
+
167
+ さらに(E)をアンコメントする(CellPainingの中でDefaultCellStyleを変更する)と、
168
+
169
+ ```
170
+
171
+ [ 0, 0] Cell=#01/Cell.Style=#02 [ 0, 1] Cell=#03/Cell.Style=#02
172
+
173
+ [ 1, 0] Cell=#04/Cell.Style=#02 [ 1, 1] Cell=#05/Cell.Style=#02
174
+
175
+ [-1, -1] : CellStyle=#06
176
+
177
+ [-1, 0] : CellStyle=#07
178
+
179
+ [-1, 1] : CellStyle=#07
180
+
181
+ [ 0, -1] : CellStyle=#08
182
+
183
+ [ 0, 0] : CellStyle=#09
184
+
185
+ [ 0, 1] : CellStyle=#09
186
+
187
+ [ 1, -1] : CellStyle=#0A
188
+
189
+ [ 1, 0] : CellStyle=#0B
190
+
191
+ [ 1, 1] : CellStyle=#0B
192
+
193
+ [-1, -1] : CellStyle=#0C
194
+
195
+ [-1, 0] : CellStyle=#0D
196
+
197
+ [-1, 1] : CellStyle=#0D
198
+
199
+ [ 0, -1] : CellStyle=#0E
200
+
201
+ [ 0, 0] : CellStyle=#0F
202
+
203
+ [ 0, 1] : CellStyle=#0F
204
+
205
+ [ 1, -1] : CellStyle=#10
206
+
207
+ [ 1, 0] : CellStyle=#11
208
+
209
+ [ 1, 1] : CellStyle=#11
210
+
211
+ ```
212
+
213
+ こんな具合になります。上記結果を元の回答コメントに照らして考えてみるといかがでしょう?

2

表現不備修正

2018/03/19 08:30

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -32,4 +32,4 @@
32
32
 
33
33
 
34
34
 
35
- 一般にイベントハンドラーの中でそのイベントが発生する原因になるようなことは避けるべきです。無限ループになってしまいますから。描画に関しては「外観に影響を及ぼす情報を変更するのは描画処理以外の場所ですべきこと」だと思ってください。
35
+ 一般にイベントハンドラーの中でそのイベントが発生する原因になるようなことを再度行うのは避けるべきです。無限ループになってしまいますから。描画に関しては「外観に影響を及ぼす情報を変更するのは描画処理以外の場所ですべきこと」だと思ってください。

1

マークダウン訂正

2018/03/19 04:56

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- さて、DataGridViewのDefaultCellStyle.ForeColorはセルの前景色を意味するのでこの値が**変化すると自動的にCellPaintingイベントが発生し再描画が行われるようになっています。
9
+ さて、DataGridViewのDefaultCellStyle.ForeColorはセルの前景色を意味するのでこの値が**変化すると**自動的にCellPaintingイベントが発生し再描画が行われるようになっています。
10
10
 
11
11
 
12
12