質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

2655閲覧

DaraGridが更新されない

kkg_No_05

総合スコア13

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1グッド

0クリップ

投稿2020/02/21 04:30

編集2020/02/21 05:02

前提・実現したいこと

以下のようなCSVファイルを読み込み、表示するプログラムです。
ボタン操作で表示するファイルを切り替えたいです。

Param_001.csvParam_002.csvParam_003.csvParam_004.csvParam_005.csv
AAA,1AAA,2AAA,3AAA,4AAA,5
BBB,11BBB,22BBB,33BBB,44BBB,55
CCC,1.1CCC,2.2CCC,3.3CCC,4.4CCC,5.5
DDD,11.1DDD,22.2DDD,33.3DDD,44.4DDD,55.5

発生している問題・エラーメッセージ

ファイル切り替え後に、DataGridに読み込み結果が表示されません。
DataTableの中身は更新されています。(ファイル出力で確認できる)

下記のコードでは、noMax = 2; として2件分を表示していますが、
起動時に読み込まれる001, 002は問題ないのですが、
切り替えた先の003, 004などが表示されません。
001, 002に戻すと、こちらは表示されます。

該当のソースコード

XAML

1<Grid> 2 <!--保存ボタン--> 3 <Button 4 x:Name="ButtonSave" 5 Click="Button_Click" 6 Content="Save Files" FontSize="30" Width="200" Margin="392,10,400,509" 7 /> 8 9 <!--ファイル切り替えボタン--> 10 <Button 11 x:Name="ButtonNext" 12 Click="ButtonNext_Click" 13 Content="&gt;&gt;" FontSize="16" 14 HorizontalAlignment="Right" 15 VerticalAlignment="Top" 16 Margin="0,35,10,0" 17 Width="75" Height="25"/> 18 <Button 19 x:Name="ButtonPrev" 20 Click="ButtonPrev_Click" 21 Content="&lt;&lt;" FontSize="16" 22 HorizontalAlignment="Right" 23 VerticalAlignment="Top" 24 Margin="0,35,100,0" 25 Width="75" Height="25"/> 26 27 <!--表--> 28 <DataGrid x:Name="DataGrid_CSV" 29 AutoGenerateColumns="False" 30 HeadersVisibility="All" 31 CanUserSortColumns="False" 32 CanUserAddRows="false" 33 CanUserDeleteRows="false" 34 CanUserReorderColumns="False" 35 CanUserResizeColumns="False" 36 CanUserResizeRows="False" Height="auto" Width="auto" Margin="0,80,0,0"> 37 38 <!-- 行ヘッダーにしてみた --> 39 <DataGrid.RowHeaderStyle> 40 <Style TargetType="{x:Type DataGridRowHeader}"> 41 <Setter Property="Content" Value="{Binding [0]}"/> 42 </Style> 43 </DataGrid.RowHeaderStyle> 44 45 <DataGrid.Columns> 46 <!--<DataGridTextColumn Header="Param" Binding="{Binding [0]}" Width="*" />--> 47 <DataGridTextColumn x:Name="Colum_01" Header="---" Binding="{Binding [1]}" Width="*" /> 48 <DataGridTextColumn x:Name="Colum_02" Header="---" Binding="{Binding [2]}" Width="*" /> 49 <DataGridTextColumn x:Name="Colum_03" Header="---" Binding="{Binding [3]}" Width="*" /> 50 <DataGridTextColumn x:Name="Colum_04" Header="---" Binding="{Binding [4]}" Width="*" /> 51 <DataGridTextColumn x:Name="Colum_05" Header="---" Binding="{Binding [5]}" Width="*" /> 52 </DataGrid.Columns> 53 54 </DataGrid> 55 </Grid>

C#

1public partial class MainWindow : Window 2 { 3 // アプリケーションパス取得 4 static string exePath = Environment.GetCommandLineArgs()[0]; 5 static string exeFullPath = Path.GetFullPath(exePath); 6 public static string startupPath = Path.GetDirectoryName(exeFullPath); 7 public static string savePath = startupPath; 8 9 // 最大読み込みファイル数 10 public int noMax = 2; 11 // 表示先頭ファイル番号 12 public int noFirst = 1; 13 // 表示末尾ファイル番号 14 public int noLast = 1; 15 // 表示ファイルインデックス 16 public int idxClm = 1; 17 // データテーブルの宣言 18 private DataTable table; 19 20 public MainWindow() 21 { 22 InitializeComponent(); 23 24 CalcNo(0); 25 MakeTable(); 26 } 27 28 // ファイル番号の計算 29 public void CalcNo(int mode) 30 { 31 switch (mode) 32 { 33 case 0: 34 noFirst = 1; 35 break; 36 case 1: // 戻る 37 noFirst -= noMax; 38 break; 39 case 2: // 進む 40 noFirst += noMax; 41 break; 42 default: 43 break; 44 } 45 noLast = noFirst + noMax - 1; 46 } 47 48 // ファイルインデックスの計算 49 public void CalcIdx(int noFile) 50 { 51 idxClm = noFile % noMax; 52 if (idxClm == 0) 53 { 54 idxClm = noMax; 55 } 56 } 57 58 // テーブル作成・表示メソッド 59 public void MakeTable() 60 { 61 // テーブルの準備 62 table = new DataTable(); 63 table.Columns.Add("Param"); 64 65 for (int noFile = noFirst; noFile <= noLast; noFile++) 66 { 67 // 2列目以降の列ヘッダ名 68 table.Columns.Add("File_" + noFile.ToString("000")); 69 70 // 対象とするファイル番号の計算と列ヘッダ名の設定 71 CalcIdx(noFile); 72 HeaderColum(noFile, idxClm); 73 74 string pathReadFile = savePath + "\Param_" + noFile.ToString("000") + ".csv"; 75 76 // ファイル情報を格納するリスト 77 List<string[]> listFile = new List<string[]>(); 78 79 ReadFile(pathReadFile, listFile); 80 81 // 最初のファイルの時はDataRow(1行分のデータ)を作成する 82 // 最初のファイルは1列目(項目名)を取得する 83 if (noFile == noFirst) 84 { 85 for (int j = 0; j < listFile.Count; j++) 86 { 87 // テーブルの行のみを扱うクラス 88 DataRow row = table.NewRow(); 89 90 // j行目の0番目 項目名 をDataRowに追加する 91 row[0] = listFile[j][0]; 92 // テーブルに行を追加 93 table.Rows.Add(row); 94 } 95 } 96 97 // 作成済みのDataRowに各設定値を追加していく 98 for (int j = 0; j < listFile.Count; j++) 99 { 100 // テーブルのj行目のno_file番目に設定値を追加する 101 table.Rows[j][idxClm] = listFile[j][1]; 102 } 103 } 104 105 DataGrid_CSV.ItemsSource = table.DefaultView; 106 } 107 108 // 列ヘッダ設定メソッド 109 public void HeaderColum(int noFile, int idxClm) 110 { 111 switch (idxClm) 112 { 113 case 1: 114 Colum_01.Header = noFile.ToString("000"); 115 break; 116 case 2: 117 Colum_02.Header = noFile.ToString("000"); 118 break; 119 default: 120 break; 121 } 122 } 123 124 // ファイル読み込みメソッド 125 public void ReadFile(string pathReadFile, List<string[]> listFile) 126 { 127 try 128 { 129 if (File.Exists(pathReadFile)) 130 { 131 using (var sr = new StreamReader(pathReadFile, Encoding.GetEncoding("shift_jis"))) 132 { 133 while (!sr.EndOfStream) 134 { 135 string line = sr.ReadLine(); 136 string[] array = line.Split(','); 137 138 listFile.Add(array); 139 } 140 } 141 } 142 } 143 catch (Exception e) 144 { 145 MessageBox.Show(e.Message); 146 } 147 } 148 149 // ファイル保存メソッド 150 public void SaveFile(string nameSave) 151 { 152 for (int noFile = noFirst; noFile <= noLast; noFile++) 153 { 154 string pathWrite = exePath + nameSave + noFile.ToString("000") + ".csv"; 155 156 CalcIdx(noFile); 157 158 // 名前と値のペアのリストを作る 159 var listFile = table.AsEnumerable() 160 .Select(x => new object[] { x[0], x[idxClm] }) 161 .ToList(); 162 163 WriteFile(pathWrite, listFile); 164 } 165 166 MessageBox.Show(noFirst.ToString("000") + "~" + noLast.ToString("000") + " を保存しました"); 167 } 168 169 // ファイル書き込みメソッド 170 public void WriteFile(string pathWrite, List<object[]> listFile) 171 { 172 try 173 { 174 using (var sw = new StreamWriter(pathWrite, false, Encoding.GetEncoding("shift_jis"))) 175 { 176 foreach (object[] csvArray in listFile) 177 { 178 sw.WriteLine(string.Join(",", csvArray)); 179 } 180 } 181 } 182 catch (Exception e) 183 { 184 MessageBox.Show(e.Message); 185 } 186 } 187 188 // ファイル切り替え 戻る 189 private void ButtonPrev_Click(object sender, RoutedEventArgs e) 190 { 191 if(noFirst > 1) 192 { 193 CalcNo(1); 194 MakeTable(); 195 } 196 } 197 198 // ファイル切り替え 進む 199 private void ButtonNext_Click(object sender, RoutedEventArgs e) 200 { 201 if (noLast < 10000) 202 { 203 CalcNo(2); 204 MakeTable(); 205 } 206 } 207 208 // 保存ボタンメソッド 209 private void Button_Click(object sender, RoutedEventArgs e) 210 { 211 string nameSave = "new_Param_"; 212 SaveFile(nameSave); 213 } 214 }

試したこと

<DataGridTextColumn x:Name="Colum_01" Header="---" Binding="{Binding [1], NotifyOnSourceUpdated=True}" Width="*" /> <DataGridTextColumn x:Name="Colum_01" Header="---" Binding="{Binding [1], NotifyOnTargetUpdated=True}" Width="*" />

bindingのプロパティかと思いましたが、結果は変わりませんでした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

AutoGenerateColumns="True"にしてみるとわかりますが、切り替え自体はできています。
表示するカラムがなく消えたように見えています。

DataTableではBinding="{Binding [1]}"のような形でも、名前を同じにしないといけないようです(よくわかっていませんが^^;

なんでもいいのですがカラムごとに違って、かつページを変えても毎回同じになる名前を指定してください。

cs

1// 2列目以降の列ヘッダ名 2//table.Columns.Add("File_" + noFile.ToString("000")); 3// ↓ 4table.Columns.Add("Column" + table.Columns.Count);

投稿2020/02/21 05:59

編集2023/07/20 14:40
TN8001

総合スコア9326

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kkg_No_05

2020/02/21 06:41

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問