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

回答編集履歴

1

見直しキャンペーン中

2023/07/29 05:03

投稿

TN8001
TN8001

スコア10108

answer CHANGED
@@ -1,216 +1,216 @@
1
- データベースはなんの関係もないんですね^^;
2
-
3
- `DataGrid`は`DataTable`の行の追加は動的に反映するが、列の追加は反映しないということですね?
4
- これは仕様ということだと思います。
5
-
6
- ではどうするかですが、`Test_List`がどうなっているかによりそうです。
7
- * 個数が固定で数も事前にわかっている
8
- `Num`や`Name`のように、無条件で列を作ってしまえばいいでしょう。
9
- * 個数は固定だが数はわからない
10
- この場合カラの状態からデータが入ったときの1回だけ、リフレッシュするような操作でよさそうです。
11
- * 個数はバラバラ
12
- 読み込みごとにリフレッシュすると重そうな気がする(未確認)ので、直接列を追加してしまったほうがいいかもしれません。
13
-
14
- ```xaml
15
- <Window
16
- x:Class="Questions358679.MainWindow"
17
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
18
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
19
- Width="800"
20
- Height="450">
21
- <DockPanel>
22
- <Button
23
- MinWidth="75"
24
- Margin="10"
25
- HorizontalAlignment="Left"
26
- Click="Button_Click"
27
- Content="Add"
28
- DockPanel.Dock="Bottom" />
29
-
30
- <Grid Margin="10">
31
- <Grid.RowDefinitions>
32
- <RowDefinition />
33
- <RowDefinition />
34
- <RowDefinition />
35
- </Grid.RowDefinitions>
36
-
37
- <DataGrid ItemsSource="{Binding DataTable1}" />
38
-
39
- <DataGrid
40
- x:Name="dataGrid2"
41
- Grid.Row="1"
42
- ItemsSource="{Binding DataTable2}" />
43
-
44
- <DataGrid
45
- x:Name="dataGrid3"
46
- Grid.Row="2"
47
- AutoGenerateColumns="False"
48
- ItemsSource="{Binding DataTable3}" />
49
- </Grid>
50
- </DockPanel>
51
- </Window>
52
- ```
53
-
54
- ```C#
55
- using System;
56
- using System.Data;
57
- using System.Globalization;
58
- using System.Linq;
59
- using System.Windows;
60
- using System.Windows.Controls;
61
- using System.Windows.Data;
62
-
63
- namespace Questions358679
64
- {
65
- public class Cat
66
- {
67
- public int Num { get; set; }
68
- public string Name { get; set; }
69
- public string Test0001 { get; set; }
70
- }
71
-
72
- public partial class MainWindow : Window
73
- {
74
- public DataTable DataTable1 { get; } = new(); // 個数が固定で数も事前にわかっている
75
- public DataTable DataTable2 { get; } = new(); // 個数は固定だが数はわからない
76
- public DataTable DataTable3 { get; } = new(); // 個数はバラバラ
77
-
78
-
79
- public MainWindow()
80
- {
81
- InitializeComponent();
82
- DataContext = this;
83
-
84
- _ = DataTable1.Columns.Add(nameof(Cat.Num), typeof(int));
85
- _ = DataTable1.Columns.Add(nameof(Cat.Name), typeof(string));
86
- for (var i = 0; i < 10; i++)
87
- {
88
- DataTable1.Columns.Add(new DataColumn($"Test_{i + 1}", typeof(double)));
89
- }
90
-
91
- _ = DataTable2.Columns.Add(nameof(Cat.Num), typeof(int));
92
- _ = DataTable2.Columns.Add(nameof(Cat.Name), typeof(string));
93
- }
94
-
95
- private void AddRow1(Cat cat)
96
- {
97
- var array = cat.Test0001.Trim('{', '}').Split(',')
98
- .Select(x => string.IsNullOrEmpty(x) ? null : (double?)double.Parse(x, CultureInfo.InvariantCulture))
99
- .ToArray();
100
-
101
- var row = DataTable1.NewRow();
102
- (row[0], row[1]) = (cat.Num, cat.Name);
103
- for (var i = 0; i < array.Length; i++)
104
- {
105
- row[2 + i] = (array[i] == null) ? DBNull.Value : array[i];
106
- }
107
- DataTable1.Rows.Add(row);
108
- }
109
-
110
- private void AddRow2(Cat cat)
111
- {
112
- var array = cat.Test0001.Trim('{', '}').Split(',')
113
- .Select(x => string.IsNullOrEmpty(x) ? null : (double?)double.Parse(x, CultureInfo.InvariantCulture))
114
- .ToArray();
115
-
116
- if (DataTable2.Columns.Count == 2)
117
- {
118
- for (var i = 0; i < array.Length; i++)
119
- {
120
- DataTable2.Columns.Add(new DataColumn($"Test_{i + 1}", typeof(double)));
121
- }
122
-
123
- // ウソくさいが一番簡単にリフレッシュできそう
124
- dataGrid2.AutoGenerateColumns = false;
125
- dataGrid2.AutoGenerateColumns = true;
126
- }
127
-
128
- var row = DataTable2.NewRow();
129
- (row[0], row[1]) = (cat.Num, cat.Name);
130
- for (var i = 0; i < array.Length; i++)
131
- {
132
- row[2 + i] = (array[i] == null) ? DBNull.Value : array[i];
133
- }
134
- DataTable2.Rows.Add(row);
135
- }
136
-
137
- // AutoGenerateColumns="False" にして自分でカラム追加
138
- private void AddRow3(Cat cat)
139
- {
140
- var columns = DataTable3.Columns;
141
- if (!columns.Contains(nameof(Cat.Num)))
142
- {
143
- _ = DataTable3.Columns.Add(nameof(Cat.Num), typeof(int));
144
-
145
- var column = new DataGridTextColumn
146
- {
147
- Header = nameof(Cat.Num),
148
- Binding = new Binding(nameof(Cat.Num)),
149
- };
150
- dataGrid3.Columns.Add(column);
151
- }
152
- if (!columns.Contains(nameof(Cat.Name)))
153
- {
154
- _ = DataTable3.Columns.Add(nameof(Cat.Name), typeof(string));
155
-
156
- var column = new DataGridTextColumn
157
- {
158
- Header = nameof(Cat.Name),
159
- Binding = new Binding(nameof(Cat.Name)),
160
- };
161
- dataGrid3.Columns.Add(column);
162
- }
163
-
164
- var array = cat.Test0001.Trim('{', '}').Split(',')
165
- .Select(x => string.IsNullOrEmpty(x) ? null : (double?)double.Parse(x, CultureInfo.InvariantCulture))
166
- .ToArray();
167
-
168
- for (var i = 0; i < array.Length; i++)
169
- {
170
- if (!columns.Contains($"Test_{i + 1}"))
171
- {
172
- DataTable3.Columns.Add(new DataColumn($"Test_{i + 1}", typeof(double)));
173
-
174
- var column = new DataGridTextColumn
175
- {
176
- Header = $"Test_{i + 1}",
177
- Binding = new Binding($"Test_{i + 1}"),
178
- };
179
- dataGrid3.Columns.Add(column);
180
-
181
- }
182
- }
183
-
184
- var row = DataTable3.NewRow();
185
- (row[0], row[1]) = (cat.Num, cat.Name);
186
- for (var i = 0; i < array.Length; i++)
187
- {
188
- row[2 + i] = (array[i] == null) ? DBNull.Value : array[i];
189
- }
190
- DataTable3.Rows.Add(row);
191
- }
192
-
193
- private int i;
194
- private void Button_Click(object sender, RoutedEventArgs e)
195
- {
196
- i++;
197
-
198
- var s = $"{{{string.Join(",", Enumerable.Range(1, 10))}}}";
199
- var cat = new Cat { Num = i, Name = ((char)('A' + i - 1)).ToString(), Test0001 = s, };
200
- AddRow1(cat);
201
- AddRow2(cat);
202
-
203
- s = $"{{{string.Join(",", Enumerable.Range(1, i))}}}";
204
- cat = new Cat { Num = i, Name = ((char)('A' + i - 1)).ToString(), Test0001 = s, };
205
- AddRow3(cat);
206
- }
207
- }
208
- }
209
- ```
210
-
211
- ---
212
-
213
- > 最終的には"{1,2,3,...,4998,4999,5000}"のように5,000列入力する予定です。
214
-
215
- データベースや`DataTable`は大丈夫かもしれませんが、`DataGrid`はどうでしょう?
1
+ データベースはなんの関係もないんですね^^;
2
+
3
+ `DataGrid`は`DataTable`の行の追加は動的に反映するが、列の追加は反映しないということですね?
4
+ これは仕様ということだと思います。
5
+
6
+ ではどうするかですが、`Test_List`がどうなっているかによりそうです。
7
+ * 個数が固定で数も事前にわかっている
8
+ `Num`や`Name`のように、無条件で列を作ってしまえばいいでしょう。
9
+ * 個数は固定だが数はわからない
10
+ この場合カラの状態からデータが入ったときの1回だけ、リフレッシュするような操作でよさそうです。
11
+ * 個数はバラバラ
12
+ 読み込みごとにリフレッシュすると重そうな気がする(未確認)ので、直接列を追加してしまったほうがいいかもしれません。
13
+
14
+ ```xml
15
+ <Window
16
+ x:Class="Questions358679.MainWindow"
17
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
18
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
19
+ Width="800"
20
+ Height="450">
21
+ <DockPanel>
22
+ <Button
23
+ MinWidth="75"
24
+ Margin="10"
25
+ HorizontalAlignment="Left"
26
+ Click="Button_Click"
27
+ Content="Add"
28
+ DockPanel.Dock="Bottom" />
29
+
30
+ <Grid Margin="10">
31
+ <Grid.RowDefinitions>
32
+ <RowDefinition />
33
+ <RowDefinition />
34
+ <RowDefinition />
35
+ </Grid.RowDefinitions>
36
+
37
+ <DataGrid ItemsSource="{Binding DataTable1}" />
38
+
39
+ <DataGrid
40
+ x:Name="dataGrid2"
41
+ Grid.Row="1"
42
+ ItemsSource="{Binding DataTable2}" />
43
+
44
+ <DataGrid
45
+ x:Name="dataGrid3"
46
+ Grid.Row="2"
47
+ AutoGenerateColumns="False"
48
+ ItemsSource="{Binding DataTable3}" />
49
+ </Grid>
50
+ </DockPanel>
51
+ </Window>
52
+ ```
53
+
54
+ ```cs
55
+ using System;
56
+ using System.Data;
57
+ using System.Globalization;
58
+ using System.Linq;
59
+ using System.Windows;
60
+ using System.Windows.Controls;
61
+ using System.Windows.Data;
62
+
63
+ namespace Questions358679
64
+ {
65
+ public class Cat
66
+ {
67
+ public int Num { get; set; }
68
+ public string Name { get; set; }
69
+ public string Test0001 { get; set; }
70
+ }
71
+
72
+ public partial class MainWindow : Window
73
+ {
74
+ public DataTable DataTable1 { get; } = new(); // 個数が固定で数も事前にわかっている
75
+ public DataTable DataTable2 { get; } = new(); // 個数は固定だが数はわからない
76
+ public DataTable DataTable3 { get; } = new(); // 個数はバラバラ
77
+
78
+
79
+ public MainWindow()
80
+ {
81
+ InitializeComponent();
82
+ DataContext = this;
83
+
84
+ _ = DataTable1.Columns.Add(nameof(Cat.Num), typeof(int));
85
+ _ = DataTable1.Columns.Add(nameof(Cat.Name), typeof(string));
86
+ for (var i = 0; i < 10; i++)
87
+ {
88
+ DataTable1.Columns.Add(new DataColumn($"Test_{i + 1}", typeof(double)));
89
+ }
90
+
91
+ _ = DataTable2.Columns.Add(nameof(Cat.Num), typeof(int));
92
+ _ = DataTable2.Columns.Add(nameof(Cat.Name), typeof(string));
93
+ }
94
+
95
+ private void AddRow1(Cat cat)
96
+ {
97
+ var array = cat.Test0001.Trim('{', '}').Split(',')
98
+ .Select(x => string.IsNullOrEmpty(x) ? null : (double?)double.Parse(x, CultureInfo.InvariantCulture))
99
+ .ToArray();
100
+
101
+ var row = DataTable1.NewRow();
102
+ (row[0], row[1]) = (cat.Num, cat.Name);
103
+ for (var i = 0; i < array.Length; i++)
104
+ {
105
+ row[2 + i] = (array[i] == null) ? DBNull.Value : array[i];
106
+ }
107
+ DataTable1.Rows.Add(row);
108
+ }
109
+
110
+ private void AddRow2(Cat cat)
111
+ {
112
+ var array = cat.Test0001.Trim('{', '}').Split(',')
113
+ .Select(x => string.IsNullOrEmpty(x) ? null : (double?)double.Parse(x, CultureInfo.InvariantCulture))
114
+ .ToArray();
115
+
116
+ if (DataTable2.Columns.Count == 2)
117
+ {
118
+ for (var i = 0; i < array.Length; i++)
119
+ {
120
+ DataTable2.Columns.Add(new DataColumn($"Test_{i + 1}", typeof(double)));
121
+ }
122
+
123
+ // ウソくさいが一番簡単にリフレッシュできそう
124
+ dataGrid2.AutoGenerateColumns = false;
125
+ dataGrid2.AutoGenerateColumns = true;
126
+ }
127
+
128
+ var row = DataTable2.NewRow();
129
+ (row[0], row[1]) = (cat.Num, cat.Name);
130
+ for (var i = 0; i < array.Length; i++)
131
+ {
132
+ row[2 + i] = (array[i] == null) ? DBNull.Value : array[i];
133
+ }
134
+ DataTable2.Rows.Add(row);
135
+ }
136
+
137
+ // AutoGenerateColumns="False" にして自分でカラム追加
138
+ private void AddRow3(Cat cat)
139
+ {
140
+ var columns = DataTable3.Columns;
141
+ if (!columns.Contains(nameof(Cat.Num)))
142
+ {
143
+ _ = DataTable3.Columns.Add(nameof(Cat.Num), typeof(int));
144
+
145
+ var column = new DataGridTextColumn
146
+ {
147
+ Header = nameof(Cat.Num),
148
+ Binding = new Binding(nameof(Cat.Num)),
149
+ };
150
+ dataGrid3.Columns.Add(column);
151
+ }
152
+ if (!columns.Contains(nameof(Cat.Name)))
153
+ {
154
+ _ = DataTable3.Columns.Add(nameof(Cat.Name), typeof(string));
155
+
156
+ var column = new DataGridTextColumn
157
+ {
158
+ Header = nameof(Cat.Name),
159
+ Binding = new Binding(nameof(Cat.Name)),
160
+ };
161
+ dataGrid3.Columns.Add(column);
162
+ }
163
+
164
+ var array = cat.Test0001.Trim('{', '}').Split(',')
165
+ .Select(x => string.IsNullOrEmpty(x) ? null : (double?)double.Parse(x, CultureInfo.InvariantCulture))
166
+ .ToArray();
167
+
168
+ for (var i = 0; i < array.Length; i++)
169
+ {
170
+ if (!columns.Contains($"Test_{i + 1}"))
171
+ {
172
+ DataTable3.Columns.Add(new DataColumn($"Test_{i + 1}", typeof(double)));
173
+
174
+ var column = new DataGridTextColumn
175
+ {
176
+ Header = $"Test_{i + 1}",
177
+ Binding = new Binding($"Test_{i + 1}"),
178
+ };
179
+ dataGrid3.Columns.Add(column);
180
+
181
+ }
182
+ }
183
+
184
+ var row = DataTable3.NewRow();
185
+ (row[0], row[1]) = (cat.Num, cat.Name);
186
+ for (var i = 0; i < array.Length; i++)
187
+ {
188
+ row[2 + i] = (array[i] == null) ? DBNull.Value : array[i];
189
+ }
190
+ DataTable3.Rows.Add(row);
191
+ }
192
+
193
+ private int i;
194
+ private void Button_Click(object sender, RoutedEventArgs e)
195
+ {
196
+ i++;
197
+
198
+ var s = $"{{{string.Join(",", Enumerable.Range(1, 10))}}}";
199
+ var cat = new Cat { Num = i, Name = ((char)('A' + i - 1)).ToString(), Test0001 = s, };
200
+ AddRow1(cat);
201
+ AddRow2(cat);
202
+
203
+ s = $"{{{string.Join(",", Enumerable.Range(1, i))}}}";
204
+ cat = new Cat { Num = i, Name = ((char)('A' + i - 1)).ToString(), Test0001 = s, };
205
+ AddRow3(cat);
206
+ }
207
+ }
208
+ }
209
+ ```
210
+
211
+ ---
212
+
213
+ > 最終的には"{1,2,3,...,4998,4999,5000}"のように5,000列入力する予定です。
214
+
215
+ データベースや`DataTable`は大丈夫かもしれませんが、`DataGrid`はどうでしょう?
216
216
  列の生成時は500列くらいですでに激重でした(仮想化が効くので列ができてしまえば、あとの操作はそんなでもないですが)