前提・実現したいこと
DataGridの特定列にComboboxを表示させ、選択可能な初期値を入力。
そして、読込んだCSVファイルの値をComboboxに表示させたい。
ユーザーの入力は不可なものとしたい。
・DataGridのComboboxに初期値を入力
・CSVから読み込んだ値をDataGirdのComboboxに表示
WPFで操作した内容を元に、HTMLファイルを動的に作るのを最終目標としています。
CSVファイルは途中経過の保存や、再開などに利用します。
全てを載せると情報が多すぎるため、ParsonClassは最低限のみ掲示しています。
Comboboxへの初期値としては
「Red」「Blue」「Green」「White」「NoColor」
の5種類を表示させたいと思っています。
それ以外の値は入力させるつもりはありません。
発生している問題・エラーメッセージ
Comboboxに値が表示されない。
初期値も入力しておきたいのですが、手段が分かりません。
DataGridにCSVの値を読込むところは問題なく動作しています。
Comboboxへの表示が出来ない状況です。
Classについて
様々なサイトを見て勉強していましたが、難しく
とり急ぎ利用していたため「Person」というものになっています。
後々編集予定ですが、どこまで関わってくるか分からないため
もっと作業が進んでから修正したいと思ってます。
たぶんもっと効率のいい書き方があるのかもしれませんが
とりあえず作っていくということも大事だと思っているため
混乱して使えなくなるよりは、今の状況を維持したいと思います。
該当のソースコード
xaml
1 <Grid> 2 <StackPanel> 3 <StackPanel Orientation="Horizontal" Height="28" Margin="10"> 4 <Button x:Name="B_read" Content="Read" 5 Click="B_read_Click" Height="28" Width="100"/> 6 <Button Content="Write" 7 Click="ExportCSV" Height="28" Width="100"/> 8 </StackPanel> 9 10 <DataGrid Height="300" x:Name="dataGrid" CanUserSortColumns="False" MouseDoubleClick="DataGridCell_MouseDoubleClick" AutoGenerateColumns="False" CanUserReorderColumns="False" > 11 <DataGrid.Columns> 12 <DataGridTextColumn Header="番号" Binding="{Binding Num}" IsReadOnly="True" /> 13 <DataGridTextColumn Header="タイトル" Binding="{Binding Title}" IsReadOnly="True" /> 14 <DataGridTextColumn Header="カレントフォルダ" Binding="{Binding CurrentFolder}" IsReadOnly="True" /> 15 <DataGridTextColumn Header="画像ファイル名" Binding="{Binding PicName}" IsReadOnly="True" /> 16 <DataGridTextColumn Header="線の色" Binding="{Binding BordColor}" IsReadOnly="True" /> 17 </DataGrid.Columns> 18 </DataGrid> 19 </StackPanel> 20 </Grid>
C#
1 2 ObservableCollection<Person> data = new ObservableCollection<Person>(); 3 public MainWindow() 4 { 5 InitializeComponent(); 6 dataGrid.ItemsSource = data; 7 8 } 9 10 class Person 11 { 12 public int Num { get; set; } 13 public string Title { get; set; } 14 public string CurrentFolder { get; set; } 15 public string PicName { get; set; } 16 public string BordColor { get; set; } 17 18 public Person(int num, string title, string currentFolder, string picName, string bordColor) 19 { 20 this.Num = num; 21 this.Title = title; 22 this.CurrentFolder = currentFolder; 23 this.PicName = picName; 24 this.BordColor = bordColor; 25 } 26 } 27 28/*Readボタンを押したとき*/ 29 private void B_read_Click(object sender, RoutedEventArgs e) 30 { 31 data.Clear(); 32 string appPath = System.AppDomain.CurrentDomain.BaseDirectory; 33 string filename = "test.csv"; 34 string filepath = appPath + "\" + filename; 35 Console.WriteLine(filepath); 36 if (File.Exists(filepath) == false) 37 { 38 return; 39 } 40 this.DataContext = ReadFile(filepath); 41 //PersonService.SetHeaders(filepath, dataGrid); 42 } 43 44/*ファイル書き込み*/ 45 public void ExportCSV(object sender, RoutedEventArgs e) 46 { 47 Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog(); 48 //保存先の初期値(マイドキュメント) 49 dlg.InitialDirectory = System.Environment.GetFolderPath(Environment.SpecialFolder.Personal); 50 dlg.Title = "保存先のファイルを選択してください"; 51 dlg.Filter = "CSVファイル(*.csv)|*.csv"; 52 if (dlg.ShowDialog() == true) 53 { 54 try 55 { 56 using (var sw = new System.IO.StreamWriter(dlg.FileName, false, System.Text.Encoding.GetEncoding("UTF-8"))) 57 { 58 foreach (Person d in data) { 59 // sw.WriteLine(dqot(d.Name) + "," + dqot(d.Place)); 60 var lineData= d.Num + "," + d.Title + "," + d.CurrentFolder + "," + d.PicName + "," + d.BordColor; 61 sw.WriteLine(lineData); 62 } 63 } 64 MessageBox.Show("保存しました"); 65 } 66 catch (SystemException ex) 67 { 68 System.Console.WriteLine(ex.Message); 69 70 } 71 } 72 } 73/*ファイル読み込み*/ 74 ObservableCollection<Person> ReadFile(string filepath) 75 { 76 try 77 { 78 // ファイルを読み取り形式で開く 79 StreamReader file = new StreamReader("test.csv", Encoding.UTF8); 80 string line = null; 81 while ((line = file.ReadLine()) != null) // 1行ずつ読み込む 82 { 83 string[] tango = line.Split(','); // カンマで区切って配列に格納 84 var d1 = int.Parse(tango[0]); 85 var d2 = tango[1]; 86 var d3 = tango[2]; 87 var d4 = tango[3]; 88 var d5 = tango[4]; 89 data.Add(new Person(d1, d2, d3, d4,d5)); 90 } 91 file.Close(); 92 } 93 catch (Exception e) 94 { 95 Console.WriteLine(e.Message); // エラーメッセージを表示 96 } 97 98 return data; 99 }
試したこと
xaml
1<DataGridTemplateColumn Header="線の色"> 2 <DataGridTemplateColumn.CellTemplate> 3 <DataTemplate> 4 <ComboBox x:Name="BorderC" DisplayMemberPath="BordColor"/> 5 </DataTemplate> 6 </DataGridTemplateColumn.CellTemplate> 7</DataGridTemplateColumn>
上記内容で修正し、初期値について入力しようと思いました。
MainWindow()内でBorderCと入力しても候補は出ず、初期値の入力は出来ませんでした。
xaml
1<DataGridTemplateColumn Header="線の色"> 2 <DataGridTemplateColumn.CellTemplate> 3 <DataTemplate> 4 <ComboBox x:Name="BorderC" ItemsSource="{Binding BordColor}" DisplayMemberPath="BordColor"/> 5 </DataTemplate> 6 </DataGridTemplateColumn.CellTemplate> 7</DataGridTemplateColumn>
上記内容でも修正してみましたが、値は何も表示されませんでした。
WPFで検索してもWinFormを利用しているものが多く、
特に理由はありませんがWPFだけで作りたいのもあるため
情報収集に少し手間取っております。
アドバイス頂けたらと思います。よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
VisualStudio 2019
.NET 4.5(だったはず)
WPF C# (※ WinFormではない)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/06/10 01:56
退会済みユーザー
2021/06/10 04:18
2022/09/19 07:32 編集
2021/06/10 04:28
退会済みユーザー
2021/06/10 04:42
2021/06/10 04:42
退会済みユーザー
2021/06/10 04:42
2021/06/10 05:01
退会済みユーザー
2021/06/10 07:28 編集
退会済みユーザー
2021/06/10 07:30 編集
2021/06/10 08:00
退会済みユーザー
2021/06/14 01:55