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

質問編集履歴

8

調査結果の記述箇所を試したことの下に移動

2021/09/10 12:58

投稿

Q10
Q10

スコア12

title CHANGED
File without changes
body CHANGED
@@ -12,19 +12,6 @@
12
12
  なぜか一度DBにデータが読み込まれた状態で一旦終了し再起動することで
13
13
  初めてTest_Listの内容が表示されます。
14
14
 
15
- 調べてみたところ、dataTableの列は正しく追加されて5つになっているにもかかわらず、DataGridは最初の2つの列{Num}, {Name}しか表示されず、残り3つの列{Test_1}, {Test_2}, {Test_3}は表示されていないようです。
16
-
17
- dataTable.Columns.Add(new DataColumn($"Test_{i + 1}", typeof(int)));の2行下の"}"にブレークポイントを貼り、DBを空にした状態で一回目に起動すると、自動変数タブのthis.dataTable.Columns.Results_Viewの[0][1][2][3][4]がそれぞれ{Num}, {Name}, {Test_1}, {Test_2}, {Test_3}と正しく入っていることが確認できました。
18
-
19
- 同様に、
20
- dataTable.Rows.Add(row);の直後の"}"にブレークポイントを貼り、DBを空にした状態で一回目に起動すると、自動変数タブのthis.dataTable.Rows.Results_View.[0].ItemArrayの[0][1][2][3][4]がそれぞれ1, "AA", 1, 2, 3と正しく入っていることが確認できました。
21
-
22
- しかし、そのままContinueすると、{Num}, {Name}の列は正しく表示されるのですが、Test_Listの部分の{Test_1}, {Test_2}, {Test_3}は表示されません。
23
-
24
- つまり、dataTableには行・列ともに正しくデータが入っているにもかかわらず、Test_Listの部分がDataGridに表示されません。
25
- これは何が原因と考えられますか?
26
- どのように確認すればよいですか?
27
-
28
15
  ### 実現したいこと
29
16
  たとえDBが空の状態でデータを読み込んでも(一回目の起動で)
30
17
  正しくTest_Listの内容を表示できるようにしたいです。
@@ -249,6 +236,19 @@
249
236
  CreateDataTable()の呼び出し位置をInitializeComponent();の前に移動しました。
250
237
  Test_Listの型をListからObservableCollectionに変更しました。
251
238
 
239
+ 調べてみたところ、dataTableの列は正しく追加されて5つになっているにもかかわらず、DataGridは最初の2つの列{Num}, {Name}しか表示されず、残り3つの列{Test_1}, {Test_2}, {Test_3}は表示されていないようです。
240
+
241
+ dataTable.Columns.Add(new DataColumn($"Test_{i + 1}", typeof(int)));の2行下の"}"にブレークポイントを貼り、DBを空にした状態で一回目に起動すると、自動変数タブのthis.dataTable.Columns.Results_Viewの[0][1][2][3][4]がそれぞれ{Num}, {Name}, {Test_1}, {Test_2}, {Test_3}と正しく入っていることが確認できました。
242
+
243
+ 同様に、
244
+ dataTable.Rows.Add(row);の直後の"}"にブレークポイントを貼り、DBを空にした状態で一回目に起動すると、自動変数タブのthis.dataTable.Rows.Results_View.[0].ItemArrayの[0][1][2][3][4]がそれぞれ1, "AA", 1, 2, 3と正しく入っていることが確認できました。
245
+
246
+ しかし、そのままContinueすると、{Num}, {Name}の列は正しく表示されるのですが、Test_Listの部分の{Test_1}, {Test_2}, {Test_3}は表示されません。
247
+
248
+ つまり、dataTableには行・列ともに正しくデータが入っているにもかかわらず、Test_Listの部分がDataGridに表示されません。
249
+ これは何が原因と考えられますか?
250
+ どのように確認すればよいですか?
251
+
252
252
  ### 補足
253
253
  Windows10
254
254
  C# .NET Core5.0

7

調査結果の追記

2021/09/10 12:58

投稿

Q10
Q10

スコア12

title CHANGED
File without changes
body CHANGED
@@ -12,6 +12,19 @@
12
12
  なぜか一度DBにデータが読み込まれた状態で一旦終了し再起動することで
13
13
  初めてTest_Listの内容が表示されます。
14
14
 
15
+ 調べてみたところ、dataTableの列は正しく追加されて5つになっているにもかかわらず、DataGridは最初の2つの列{Num}, {Name}しか表示されず、残り3つの列{Test_1}, {Test_2}, {Test_3}は表示されていないようです。
16
+
17
+ dataTable.Columns.Add(new DataColumn($"Test_{i + 1}", typeof(int)));の2行下の"}"にブレークポイントを貼り、DBを空にした状態で一回目に起動すると、自動変数タブのthis.dataTable.Columns.Results_Viewの[0][1][2][3][4]がそれぞれ{Num}, {Name}, {Test_1}, {Test_2}, {Test_3}と正しく入っていることが確認できました。
18
+
19
+ 同様に、
20
+ dataTable.Rows.Add(row);の直後の"}"にブレークポイントを貼り、DBを空にした状態で一回目に起動すると、自動変数タブのthis.dataTable.Rows.Results_View.[0].ItemArrayの[0][1][2][3][4]がそれぞれ1, "AA", 1, 2, 3と正しく入っていることが確認できました。
21
+
22
+ しかし、そのままContinueすると、{Num}, {Name}の列は正しく表示されるのですが、Test_Listの部分の{Test_1}, {Test_2}, {Test_3}は表示されません。
23
+
24
+ つまり、dataTableには行・列ともに正しくデータが入っているにもかかわらず、Test_Listの部分がDataGridに表示されません。
25
+ これは何が原因と考えられますか?
26
+ どのように確認すればよいですか?
27
+
15
28
  ### 実現したいこと
16
29
  たとえDBが空の状態でデータを読み込んでも(一回目の起動で)
17
30
  正しくTest_Listの内容を表示できるようにしたいです。
@@ -97,7 +110,7 @@
97
110
  {
98
111
  dataTable.Columns.Add(new DataColumn($"Test_{i + 1}", typeof(int)));
99
112
  }
100
- }
113
+ } // ここにブレークポイントを貼る
101
114
 
102
115
  foreach (Cat cat in result.ToList())
103
116
  {
@@ -116,7 +129,7 @@
116
129
  row[2 + i] = (test_list[i] == null) ? DBNull.Value : test_list[i];
117
130
  }
118
131
  dataTable.Rows.Add(row);
119
- }
132
+ } // ここにブレークポイントを貼る
120
133
  }
121
134
  }
122
135
 

6

DataTableに内容が表示されない→DataGridに内容が表示されない

2021/09/10 12:54

投稿

Q10
Q10

スコア12

title CHANGED
@@ -1,1 +1,1 @@
1
- データ読込直後はDataTableに内容が表示されない
1
+ データ読込直後はDataGridに内容が表示されない
body CHANGED
File without changes

5

DataTableに表示→DataGridに表示

2021/09/10 08:18

投稿

Q10
Q10

スコア12

title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,5 @@
1
1
  ### 前提
2
- CSVデータをPostgreSQLデータベースに読み込み、その内容をDataTableに表示するプログラムです。
2
+ CSVデータをPostgreSQLデータベースに読み込み、その内容をDataGridに表示するプログラムです。
3
3
  データの読み込みは`Import CSV`ボタンで行います。
4
4
 
5
5
  データは
@@ -252,5 +252,5 @@
252
252
  PostgreSQL上の列数は1つ(Excelで言うところのセル1つ)のみになり、上限を超えずに済みます。
253
253
  その代わり、DataTable側で読み込む際に分解してやる必要がある訳です。
254
254
 
255
- また、DataGridをやめてDataTableを導入した理由は、
255
+ また、DataTableを導入した理由は、
256
256
  実行時に任意の数の列を追加するためです。

4

訂正: 任意の数の桁 →任意の数の列

2021/09/10 08:17

投稿

Q10
Q10

スコア12

title CHANGED
File without changes
body CHANGED
@@ -253,4 +253,4 @@
253
253
  その代わり、DataTable側で読み込む際に分解してやる必要がある訳です。
254
254
 
255
255
  また、DataGridをやめてDataTableを導入した理由は、
256
- 実行時に任意の数のを追加するためです。
256
+ 実行時に任意の数のを追加するためです。

3

コードを削減し、説明を追記

2021/09/10 06:48

投稿

Q10
Q10

スコア12

title CHANGED
File without changes
body CHANGED
@@ -1,7 +1,35 @@
1
+ ### 前提
2
+ CSVデータをPostgreSQLデータベースに読み込み、その内容をDataTableに表示するプログラムです。
3
+ データの読み込みは`Import CSV`ボタンで行います。
4
+
5
+ データは
6
+ > 1,AA,"{1,2,3}"
7
+
8
+ のようなCSV形式で、データの後半"{1,2,3}"をTest_Listと呼んでいます。
9
+
10
+ ### 問題
1
- DBが空でImport CSVでデータを読み込むとTest_Listの内容が表示されない
11
+ DBが空の状態でデータを読み込むとTest_Listの内容が表示されません。
2
- データが読み込まれた状態で起動すると内容が表示される
12
+ なぜか一度DBにデータが読み込まれた状態で一旦終了し再起動する
13
+ 初めてTest_Listの内容が表示されます。
14
+
15
+ ### 実現したいこと
16
+ たとえDBが空の状態でデータを読み込んでも(一回目の起動で)
17
+ 正しくTest_Listの内容を表示できるようにしたいです。
18
+
19
+ ### コード
3
20
  MainWindow.xaml.cs
4
21
  ```C#
22
+ using Npgsql;
23
+ using System;
24
+ using System.Collections.Generic;
25
+ using System.Data;
26
+ using System.Linq;
27
+ using System.Text;
28
+ using System.Text.RegularExpressions;
29
+ using System.Windows;
30
+
31
+ namespace WpfApp1
32
+ {
5
33
  public partial class MainWindow : Window
6
34
  {
7
35
  public DataTable dataTable { get; } = new DataTable();
@@ -28,7 +56,6 @@
28
56
  conn.Close();
29
57
  }
30
58
  CreateDataTable();
31
- Actual_Search();
32
59
  InitializeComponent();
33
60
  }
34
61
 
@@ -93,56 +120,6 @@
93
120
  }
94
121
  }
95
122
 
96
- private void Actual_Search()
97
- {
98
- BackgroundWorker worker = new BackgroundWorker();
99
- worker.DoWork += SearchProcess;
100
- worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(SearchProcessCompleted);
101
- worker.RunWorkerAsync();
102
- }
103
-
104
- private void searchData()
105
- {
106
- using (var context = new PgDbContext())
107
- {
108
- var tblCat = context.Cats;
109
- IQueryable<Cat> result;
110
- result = from x in tblCat
111
- select x;
112
- this.dataGrid.ItemsSource = result.ToList();
113
- }
114
- }
115
-
116
- private void SearchProcess(object sender, DoWorkEventArgs e)
117
- {
118
- using (var context = new PgDbContext())
119
- {
120
- var tblCat = context.Cats;
121
- IQueryable<Cat> result;
122
- result = from x in tblCat
123
- select x;
124
-
125
- List<CatModel> resultList = new List<CatModel>();
126
- foreach (Cat cat in result.ToList())
127
- {
128
- var numbers = Regex.Match(cat.Test_0001, @"\{(?<numbers>[\d+,]+)\}").Groups["numbers"].Value;
129
- double?[] test_ = numbers.Split(',')
130
- .Select(x => String.IsNullOrEmpty(x) ? null : (double?)double.Parse(x))
131
- .ToArray();
132
- List<double?> test_list = test_.ToList<double?>();
133
- var oc = new ObservableCollection<double?>();
134
- test_list.ForEach(x => oc.Add(x));
135
- resultList.Add(new CatModel(cat.Num, cat.Name, oc));
136
- }
137
- e.Result = resultList;
138
- }
139
- }
140
-
141
- private void SearchProcessCompleted(object sender, RunWorkerCompletedEventArgs e)
142
- {
143
- this.dataGrid.ItemsSource = e.Result as List<CatModel>;
144
- }
145
-
146
123
  private void imp_button_Click(object sender, RoutedEventArgs e)
147
124
  {
148
125
  List<Cat> list = new List<Cat>() { new Cat() { Num=1, Name="AA", Test_0001="{1,2,3}"} };
@@ -159,10 +136,9 @@
159
136
  }
160
137
  }
161
138
  CreateDataTable();
162
- searchData();
163
- Actual_Search();
164
139
  }
165
140
  }
141
+ }
166
142
  ```
167
143
 
168
144
  MainWindow.xaml
@@ -180,20 +156,6 @@
180
156
  <Grid Width="700" Height="700">
181
157
  <DataGrid AutoGenerateColumns="True" ItemsSource="{Binding dataTable, ElementName=mainWindow}"
182
158
  HorizontalAlignment="Left" Margin="10,10,10,10"/>
183
- <DataGrid AutoGenerateColumns="False" Name="dataGrid" HorizontalAlignment="Left" Margin="10,125,0,439" Width="650">
184
- <DataGrid.Columns>
185
- <DataGridTemplateColumn Header="Select" Width="50">
186
- <DataGridTemplateColumn.CellTemplate>
187
- <DataTemplate>
188
- <CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center" VerticalAlignment="Center" />
189
- </DataTemplate>
190
- </DataGridTemplateColumn.CellTemplate>
191
- </DataGridTemplateColumn>
192
- <DataGridTextColumn Binding="{Binding Num}" ClipboardContentBinding="{x:Null}" Header="Num" Width="50"/>
193
- <DataGridTextColumn Binding="{Binding Name}" ClipboardContentBinding="{x:Null}" Header="Name" Width="100"/>
194
- <DataGridTextColumn Binding="{Binding Test_List}" ClipboardContentBinding="{x:Null}" Header="Test_List" Width="*"/>
195
- </DataGrid.Columns>
196
- </DataGrid>
197
159
  <Button x:Name="imp_button" Content="Import CSV" HorizontalAlignment="Left" Margin="250,273,0,0" VerticalAlignment="Top" Width="75" Height="30" Click="imp_button_Click"/>
198
160
  </Grid>
199
161
  </Window>
@@ -201,6 +163,12 @@
201
163
 
202
164
  Cat.cs
203
165
  ```C#
166
+ using System;
167
+ using System.ComponentModel.DataAnnotations;
168
+ using System.ComponentModel.DataAnnotations.Schema;
169
+
170
+ namespace WpfApp1
171
+ {
204
172
  [Table("tblcat")]
205
173
  class Cat
206
174
  {
@@ -212,13 +180,20 @@
212
180
  [DatabaseGenerated(DatabaseGeneratedOption.None)]
213
181
  [Column("name", Order = 1)]
214
182
  public String Name { get; set; }
183
+ #nullable enable
215
184
  [Column("test")]
216
185
  public string? Test_0001 { get; set; }
186
+ #nullable disable
217
187
  }
188
+ }
218
189
  ```
219
190
 
220
191
  CatModel.cs
221
192
  ```C#
193
+ using System.Collections.ObjectModel;
194
+
195
+ namespace WpfApp1
196
+ {
222
197
  public class CatModel
223
198
  {
224
199
  public CatModel(int Num, string Name, ObservableCollection<double?> Test_List)
@@ -233,10 +208,16 @@
233
208
  public string Name { get; set; }
234
209
  public ObservableCollection<double?> Test_List { get; set; }
235
210
  }
211
+ }
236
212
  ```
237
213
 
238
214
  PgDbContext.cs
239
215
  ```C#
216
+ using Npgsql;
217
+ using System.Data.Entity;
218
+
219
+ namespace WpfApp1
220
+ {
240
221
  class PgDbContext : DbContext
241
222
  {
242
223
  private const string ConnectionString = "Server=localhost;User ID=postgres;Password=postgres;Database=postgres;port=5432";
@@ -248,4 +229,28 @@
248
229
  Database.SetInitializer<PgDbContext>(null);
249
230
  }
250
231
  }
232
+ }
251
- ```
233
+ ```
234
+
235
+ ### 試したこと
236
+ CreateDataTable()の呼び出し位置をInitializeComponent();の前に移動しました。
237
+ Test_Listの型をListからObservableCollectionに変更しました。
238
+
239
+ ### 補足
240
+ Windows10
241
+ C# .NET Core5.0
242
+ VisualStudio2019
243
+
244
+ PostgreSQLのDB名、ユーザー名、パスワードは共にpostgres
245
+ スキーマはpublic
246
+
247
+ 今回使ったTest_Listデータは"{1,2,3}"のように3つしかありませんが、
248
+ 最終的には"{1,2,3,...,4998,4999,5000}"のように5,000列入力する予定です。
249
+ PostgreSQLの列数の上限は1,600列までであり、
250
+ 通常のCSV形式"1,2,3,...,4998,4999,5000"では上限を超えてしまい、エラーになります。
251
+ そこで、Test_Listを1つの配列型"{1,2,3,...,4998,4999,5000}"で定義することで、
252
+ PostgreSQL上の列数は1つ(Excelで言うところのセル1つ)のみになり、上限を超えずに済みます。
253
+ その代わり、DataTable側で読み込む際に分解してやる必要がある訳です。
254
+
255
+ また、DataGridをやめてDataTableを導入した理由は、
256
+ 実行時に任意の数の桁を追加するためです。

2

List -> ObservableCollection

2021/09/10 06:33

投稿

Q10
Q10

スコア12

title CHANGED
File without changes
body CHANGED
@@ -1,11 +1,5 @@
1
- DBが空の状態で
2
-
3
- > 1,AA,"{1,2,3}"
4
-
5
- というデータを読み込むとTest_Listの内容が表示されない
1
+ DBが空でImport CSVでデータを読み込むとTest_Listの内容が表示されない
6
- データが読み込まれた状態で起動すると初めて内容が表示される
2
+ データが読み込まれた状態で起動すると内容が表示される
7
- DBが空の状態でデータを読み込んでも内容を表示できるようにしたい。
8
-
9
3
  MainWindow.xaml.cs
10
4
  ```C#
11
5
  public partial class MainWindow : Window
@@ -136,7 +130,9 @@
136
130
  .Select(x => String.IsNullOrEmpty(x) ? null : (double?)double.Parse(x))
137
131
  .ToArray();
138
132
  List<double?> test_list = test_.ToList<double?>();
133
+ var oc = new ObservableCollection<double?>();
134
+ test_list.ForEach(x => oc.Add(x));
139
- resultList.Add(new CatModel(cat.Num, cat.Name, test_list));
135
+ resultList.Add(new CatModel(cat.Num, cat.Name, oc));
140
136
  }
141
137
  e.Result = resultList;
142
138
  }
@@ -182,23 +178,20 @@
182
178
  BorderThickness="1">
183
179
 
184
180
  <Grid Width="700" Height="700">
185
- <DataGrid IsReadOnly="True"
186
- AutoGenerateColumns="True"
187
- ItemsSource="{Binding dataTable, ElementName=mainWindow}"
181
+ <DataGrid AutoGenerateColumns="True" ItemsSource="{Binding dataTable, ElementName=mainWindow}"
188
- HorizontalAlignment="Left"
189
- Margin="10,10,10,10"/>
182
+ HorizontalAlignment="Left" Margin="10,10,10,10"/>
190
183
  <DataGrid AutoGenerateColumns="False" Name="dataGrid" HorizontalAlignment="Left" Margin="10,125,0,439" Width="650">
191
184
  <DataGrid.Columns>
192
- <DataGridTemplateColumn IsReadOnly="True" Header="Select" Width="50">
185
+ <DataGridTemplateColumn Header="Select" Width="50">
193
186
  <DataGridTemplateColumn.CellTemplate>
194
187
  <DataTemplate>
195
188
  <CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center" VerticalAlignment="Center" />
196
189
  </DataTemplate>
197
190
  </DataGridTemplateColumn.CellTemplate>
198
191
  </DataGridTemplateColumn>
199
- <DataGridTextColumn Binding="{Binding Num}" ClipboardContentBinding="{x:Null}" Header="Num" IsReadOnly="True" Width="50"/>
192
+ <DataGridTextColumn Binding="{Binding Num}" ClipboardContentBinding="{x:Null}" Header="Num" Width="50"/>
200
- <DataGridTextColumn Binding="{Binding Name}" ClipboardContentBinding="{x:Null}" Header="Name" IsReadOnly="True" Width="100"/>
193
+ <DataGridTextColumn Binding="{Binding Name}" ClipboardContentBinding="{x:Null}" Header="Name" Width="100"/>
201
- <DataGridTextColumn Binding="{Binding Test_List}" ClipboardContentBinding="{x:Null}" Header="Test_List" IsReadOnly="True" Width="*"/>
194
+ <DataGridTextColumn Binding="{Binding Test_List}" ClipboardContentBinding="{x:Null}" Header="Test_List" Width="*"/>
202
195
  </DataGrid.Columns>
203
196
  </DataGrid>
204
197
  <Button x:Name="imp_button" Content="Import CSV" HorizontalAlignment="Left" Margin="250,273,0,0" VerticalAlignment="Top" Width="75" Height="30" Click="imp_button_Click"/>
@@ -228,17 +221,17 @@
228
221
  ```C#
229
222
  public class CatModel
230
223
  {
231
- public CatModel(int Num, String Name, List<double?> Test_List)
224
+ public CatModel(int Num, string Name, ObservableCollection<double?> Test_List)
232
225
  {
233
226
  this.IsChecked = false;
234
227
  this.Num = Num;
235
228
  this.Name = Name;
236
229
  this.Test_List = Test_List;
237
230
  }
238
- public Boolean IsChecked { get; set; }
231
+ public bool IsChecked { get; set; }
239
232
  public int Num { get; set; }
240
- public String Name { get; set; }
233
+ public string Name { get; set; }
241
- public List<double?> Test_List { get; set; }
234
+ public ObservableCollection<double?> Test_List { get; set; }
242
235
  }
243
236
  ```
244
237
 
@@ -255,7 +248,4 @@
255
248
  Database.SetInitializer<PgDbContext>(null);
256
249
  }
257
250
  }
258
- ```
251
+ ```
259
- ### 補足
260
- データ読込はImport CSVボタン
261
- 下のDataGridは後で消す

1

10,000字の制限で書けなかった補足を追加

2021/09/09 16:14

投稿

Q10
Q10

スコア12

title CHANGED
File without changes
body CHANGED
@@ -256,5 +256,6 @@
256
256
  }
257
257
  }
258
258
  ```
259
- ### 試したこと
259
+ ### 補足
260
- Test_ListをListからObservableCollectionに変更
260
+ データ読込はImport CSVボタン
261
+ 下のDataGridは後で消す