前提・実現したいこと
以下のようなCSVファイルを読み込み、表示するプログラムです。
ボタン操作で表示するファイルを切り替えたいです。
Param_001.csv | Param_002.csv | Param_003.csv | Param_004.csv | Param_005.csv |
---|---|---|---|---|
AAA,1 | AAA,2 | AAA,3 | AAA,4 | AAA,5 |
BBB,11 | BBB,22 | BBB,33 | BBB,44 | BBB,55 |
CCC,1.1 | CCC,2.2 | CCC,3.3 | CCC,4.4 | CCC,5.5 |
DDD,11.1 | DDD,22.2 | DDD,33.3 | DDD,44.4 | DDD,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=">>" 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="<<" 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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/21 06:41