回答編集履歴

1

見直しキャンペーン中

2023/07/29 05:03

投稿

TN8001
TN8001

スコア9396

test CHANGED
@@ -1,431 +1,216 @@
1
1
  データベースはなんの関係もないんですね^^;
2
2
 
3
-
4
-
5
3
  `DataGrid`は`DataTable`の行の追加は動的に反映するが、列の追加は反映しないということですね?
6
-
7
4
  これは仕様ということだと思います。
8
5
 
9
-
10
-
11
6
  ではどうするかですが、`Test_List`がどうなっているかによりそうです。
12
-
13
7
  * 個数が固定で数も事前にわかっている
14
-
15
8
  `Num`や`Name`のように、無条件で列を作ってしまえばいいでしょう。
16
-
17
9
  * 個数は固定だが数はわからない
18
-
19
10
  この場合カラの状態からデータが入ったときの1回だけ、リフレッシュするような操作でよさそうです。
20
-
21
11
  * 個数はバラバラ
22
-
23
12
  読み込みごとにリフレッシュすると重そうな気がする(未確認)ので、直接列を追加してしまったほうがいいかもしれません。
24
13
 
25
-
26
-
27
- ```xaml
14
+ ```xml
28
-
29
15
  <Window
30
-
31
16
  x:Class="Questions358679.MainWindow"
32
-
33
17
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
34
-
35
18
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
36
-
37
19
  Width="800"
38
-
39
20
  Height="450">
40
-
41
21
  <DockPanel>
42
-
43
22
  <Button
44
-
45
23
  MinWidth="75"
46
-
47
24
  Margin="10"
48
-
49
25
  HorizontalAlignment="Left"
50
-
51
26
  Click="Button_Click"
52
-
53
27
  Content="Add"
54
-
55
28
  DockPanel.Dock="Bottom" />
56
29
 
57
-
58
-
59
30
  <Grid Margin="10">
60
-
61
31
  <Grid.RowDefinitions>
62
-
63
32
  <RowDefinition />
64
-
65
33
  <RowDefinition />
66
-
67
34
  <RowDefinition />
68
-
69
35
  </Grid.RowDefinitions>
70
-
71
36
 
72
-
73
37
  <DataGrid ItemsSource="{Binding DataTable1}" />
74
-
75
38
 
76
-
77
39
  <DataGrid
78
-
79
40
  x:Name="dataGrid2"
80
-
81
41
  Grid.Row="1"
82
-
83
42
  ItemsSource="{Binding DataTable2}" />
84
-
85
43
 
86
-
87
44
  <DataGrid
88
-
89
45
  x:Name="dataGrid3"
90
-
91
46
  Grid.Row="2"
92
-
93
47
  AutoGenerateColumns="False"
94
-
95
48
  ItemsSource="{Binding DataTable3}" />
96
-
97
49
  </Grid>
98
-
99
50
  </DockPanel>
100
-
101
51
  </Window>
102
-
103
52
  ```
104
53
 
105
-
106
-
107
- ```C#
54
+ ```cs
108
-
109
55
  using System;
110
-
111
56
  using System.Data;
112
-
113
57
  using System.Globalization;
114
-
115
58
  using System.Linq;
116
-
117
59
  using System.Windows;
118
-
119
60
  using System.Windows.Controls;
120
-
121
61
  using System.Windows.Data;
122
62
 
123
-
124
-
125
63
  namespace Questions358679
126
-
127
64
  {
128
-
129
65
  public class Cat
130
-
131
66
  {
132
-
133
67
  public int Num { get; set; }
134
-
135
68
  public string Name { get; set; }
136
-
137
69
  public string Test0001 { get; set; }
138
-
139
70
  }
140
71
 
141
-
142
-
143
72
  public partial class MainWindow : Window
144
-
145
73
  {
146
-
147
74
  public DataTable DataTable1 { get; } = new(); // 個数が固定で数も事前にわかっている
148
-
149
75
  public DataTable DataTable2 { get; } = new(); // 個数は固定だが数はわからない
150
-
151
76
  public DataTable DataTable3 { get; } = new(); // 個数はバラバラ
152
77
 
153
78
 
154
-
155
-
156
-
157
79
  public MainWindow()
158
-
159
- {
80
+ {
160
-
161
81
  InitializeComponent();
162
-
163
82
  DataContext = this;
164
83
 
165
-
166
-
167
84
  _ = DataTable1.Columns.Add(nameof(Cat.Num), typeof(int));
168
-
169
85
  _ = DataTable1.Columns.Add(nameof(Cat.Name), typeof(string));
170
-
171
86
  for (var i = 0; i < 10; i++)
172
-
173
- {
87
+ {
174
-
175
88
  DataTable1.Columns.Add(new DataColumn($"Test_{i + 1}", typeof(double)));
176
-
177
- }
89
+ }
178
-
179
-
180
90
 
181
91
  _ = DataTable2.Columns.Add(nameof(Cat.Num), typeof(int));
182
-
183
92
  _ = DataTable2.Columns.Add(nameof(Cat.Name), typeof(string));
184
-
185
- }
93
+ }
186
-
187
-
188
94
 
189
95
  private void AddRow1(Cat cat)
190
-
191
- {
96
+ {
192
-
193
97
  var array = cat.Test0001.Trim('{', '}').Split(',')
194
-
195
98
  .Select(x => string.IsNullOrEmpty(x) ? null : (double?)double.Parse(x, CultureInfo.InvariantCulture))
196
-
197
99
  .ToArray();
198
100
 
199
-
200
-
201
101
  var row = DataTable1.NewRow();
202
-
203
102
  (row[0], row[1]) = (cat.Num, cat.Name);
204
-
205
- for (var i = 0; i < array.Length; i++)
103
+ for (var i = 0; i < array.Length; i++)
206
-
207
- {
104
+ {
208
-
209
105
  row[2 + i] = (array[i] == null) ? DBNull.Value : array[i];
210
-
211
- }
106
+ }
212
-
213
107
  DataTable1.Rows.Add(row);
214
-
215
- }
108
+ }
216
-
217
-
218
109
 
219
110
  private void AddRow2(Cat cat)
220
-
221
- {
111
+ {
222
-
223
112
  var array = cat.Test0001.Trim('{', '}').Split(',')
224
-
225
113
  .Select(x => string.IsNullOrEmpty(x) ? null : (double?)double.Parse(x, CultureInfo.InvariantCulture))
226
-
227
114
  .ToArray();
228
115
 
229
-
230
-
231
116
  if (DataTable2.Columns.Count == 2)
232
-
233
- {
117
+ {
234
-
235
118
  for (var i = 0; i < array.Length; i++)
236
-
237
- {
119
+ {
238
-
239
120
  DataTable2.Columns.Add(new DataColumn($"Test_{i + 1}", typeof(double)));
240
-
241
121
  }
242
122
 
243
-
244
-
245
123
  // ウソくさいが一番簡単にリフレッシュできそう
246
-
247
124
  dataGrid2.AutoGenerateColumns = false;
248
-
249
125
  dataGrid2.AutoGenerateColumns = true;
250
-
251
- }
126
+ }
252
-
253
-
254
127
 
255
128
  var row = DataTable2.NewRow();
256
-
257
129
  (row[0], row[1]) = (cat.Num, cat.Name);
258
-
259
- for (var i = 0; i < array.Length; i++)
130
+ for (var i = 0; i < array.Length; i++)
260
-
261
- {
131
+ {
262
-
263
132
  row[2 + i] = (array[i] == null) ? DBNull.Value : array[i];
264
-
265
- }
133
+ }
266
-
267
134
  DataTable2.Rows.Add(row);
268
-
269
- }
135
+ }
270
-
271
-
272
136
 
273
137
  // AutoGenerateColumns="False" にして自分でカラム追加
274
-
275
138
  private void AddRow3(Cat cat)
276
-
277
- {
139
+ {
278
-
279
140
  var columns = DataTable3.Columns;
280
-
281
141
  if (!columns.Contains(nameof(Cat.Num)))
282
-
283
- {
142
+ {
284
-
285
143
  _ = DataTable3.Columns.Add(nameof(Cat.Num), typeof(int));
286
144
 
287
-
288
-
289
145
  var column = new DataGridTextColumn
290
-
291
- {
146
+ {
292
-
293
147
  Header = nameof(Cat.Num),
294
-
295
148
  Binding = new Binding(nameof(Cat.Num)),
296
-
297
149
  };
298
-
299
150
  dataGrid3.Columns.Add(column);
300
-
301
- }
151
+ }
302
-
303
152
  if (!columns.Contains(nameof(Cat.Name)))
304
-
305
- {
153
+ {
306
-
307
154
  _ = DataTable3.Columns.Add(nameof(Cat.Name), typeof(string));
308
155
 
309
-
310
-
311
156
  var column = new DataGridTextColumn
312
-
313
- {
157
+ {
314
-
315
158
  Header = nameof(Cat.Name),
316
-
317
159
  Binding = new Binding(nameof(Cat.Name)),
318
-
319
160
  };
320
-
321
161
  dataGrid3.Columns.Add(column);
322
-
323
- }
162
+ }
324
-
325
-
326
163
 
327
164
  var array = cat.Test0001.Trim('{', '}').Split(',')
328
-
329
165
  .Select(x => string.IsNullOrEmpty(x) ? null : (double?)double.Parse(x, CultureInfo.InvariantCulture))
330
-
331
166
  .ToArray();
332
167
 
333
-
334
-
335
- for (var i = 0; i < array.Length; i++)
168
+ for (var i = 0; i < array.Length; i++)
336
-
337
- {
169
+ {
338
-
339
170
  if (!columns.Contains($"Test_{i + 1}"))
340
-
341
- {
171
+ {
342
-
343
172
  DataTable3.Columns.Add(new DataColumn($"Test_{i + 1}", typeof(double)));
344
173
 
345
-
346
-
347
174
  var column = new DataGridTextColumn
348
-
349
175
  {
350
-
351
176
  Header = $"Test_{i + 1}",
352
-
353
177
  Binding = new Binding($"Test_{i + 1}"),
354
-
355
178
  };
356
-
357
179
  dataGrid3.Columns.Add(column);
358
180
 
359
-
360
-
361
181
  }
362
-
363
- }
182
+ }
364
-
365
-
366
183
 
367
184
  var row = DataTable3.NewRow();
368
-
369
185
  (row[0], row[1]) = (cat.Num, cat.Name);
370
-
371
- for (var i = 0; i < array.Length; i++)
186
+ for (var i = 0; i < array.Length; i++)
372
-
373
- {
187
+ {
374
-
375
188
  row[2 + i] = (array[i] == null) ? DBNull.Value : array[i];
376
-
377
- }
189
+ }
378
-
379
190
  DataTable3.Rows.Add(row);
380
-
381
- }
191
+ }
382
-
383
-
384
192
 
385
193
  private int i;
386
-
387
194
  private void Button_Click(object sender, RoutedEventArgs e)
388
-
389
- {
195
+ {
390
-
391
196
  i++;
392
197
 
393
-
394
-
395
198
  var s = $"{{{string.Join(",", Enumerable.Range(1, 10))}}}";
396
-
397
199
  var cat = new Cat { Num = i, Name = ((char)('A' + i - 1)).ToString(), Test0001 = s, };
398
-
399
200
  AddRow1(cat);
400
-
401
201
  AddRow2(cat);
402
202
 
403
-
404
-
405
203
  s = $"{{{string.Join(",", Enumerable.Range(1, i))}}}";
406
-
407
204
  cat = new Cat { Num = i, Name = ((char)('A' + i - 1)).ToString(), Test0001 = s, };
408
-
409
205
  AddRow3(cat);
410
-
411
- }
206
+ }
412
-
413
207
  }
414
-
415
208
  }
416
-
417
209
  ```
418
210
 
419
-
420
-
421
211
  ---
422
212
 
423
-
424
-
425
213
  > 最終的には"{1,2,3,...,4998,4999,5000}"のように5,000列入力する予定です。
426
214
 
427
-
428
-
429
215
  データベースや`DataTable`は大丈夫かもしれませんが、`DataGrid`はどうでしょう?
430
-
431
216
  列の生成時は500列くらいですでに激重でした(仮想化が効くので列ができてしまえば、あとの操作はそんなでもないですが)