初めまして、よろしくお願いいたします。
前提・実現したいこと
WPFで表を作る場合、「ObservableCollection」でまとめたほうが良いとみかけます。
「INotifyCollectionChanged」を利用すれば、更新したという事が分かるとも見かけました。
物凄く初歩的な話を分かっていないのだと思います。
以下内容を一行したいと思っています。
①データをファイルから読み込む(Button1)
②WPFアプリ上でテキストボックスなど入力後ボタンを押してデータを追加する(Button3)
③データをファイルに書き出す(①と③は同じデータ形式)(Button2?)
例えるなら、CSVをWPF上で開き、変更して保存したいという感じです。
列の項目は決まっており、途中コンボボックスでしか選択できない項目もあります。
別のフォームでも値を利用したいことから、
Publicにすればいいと思いました。
とりあえず、XMLファイルへの書き出し、読み込みをしようと思っています。
発生している問題・エラーメッセージ
1.xmlファイルの読み込みの、どこがおかしいのかが分からない。
「https://memo.abridge-lab.com/?p=145」のサイトを参考にしましたが、
Class?のつくり方が違うので良くわかりませんでした。
xmlファイルを読込み、itemsの中にデータを入れてDataGridにデータを表示させたいです。
2.IDは連番(カウントアップ方式で重ならない)にしたいのですが、番号の保持方法が良く分からない
※ 行の削除、追加も検討中のため、IDを変更することがあります
該当のソースコード
xaml
1<Window x:Class="ClickCap.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:ClickCap" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="450" Width="800"> 9 <Grid> 10 <DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False" Margin="0,0,0,67"> 11 <DataGrid.Columns> 12 13 <DataGridTextColumn Header="ID" Binding="{Binding Myid}" /> 14 <DataGridTextColumn Header="タイトル" Binding="{Binding Title}" /> 15 <DataGridTextColumn Header="詳細" Binding="{Binding Detail}" /> 16 </DataGrid.Columns> 17 </DataGrid> 18 <Button Content="Button" HorizontalAlignment="Left" Margin="182,391,0,0" VerticalAlignment="Top" Click="Button_Click"/> 19 <Button Content="Button" HorizontalAlignment="Left" Margin="446,392,0,0" VerticalAlignment="Top" Click="Button_Click_1"/> 20 <Button Content="Button" HorizontalAlignment="Left" Margin="680,392,0,0" VerticalAlignment="Top" Click="Button_Click_2"/> 21 </Grid> 22</Window>
c#
1using System; 2using System.Collections.Generic; 3using System.Collections.ObjectModel; 4using System.IO; 5using System.Linq; 6using System.Text; 7using System.Threading.Tasks; 8using System.Windows; 9using System.Windows.Controls; 10using System.Windows.Data; 11using System.Windows.Documents; 12using System.Windows.Input; 13using System.Windows.Media; 14using System.Windows.Media.Imaging; 15using System.Windows.Navigation; 16using System.Windows.Shapes; 17using System.Xml.Serialization; 18 19namespace ClickCap 20{ 21 /// <summary> 22 /// MainWindow.xaml の相互作用ロジック 23 /// </summary> 24 public partial class MainWindow : Window 25 { 26 public ObservableCollection<Item> items { get; } = new ObservableCollection<Item>(); 27 public class Item 28 { 29 public int Myid { get; set; } 30 public string Title { get; set; } 31 public string Detail { get; set; } 32 public bool Isedit { get; set; } 33 } 34 35 public MainWindow() 36 { 37 InitializeComponent(); 38 items.Add(new Item { Myid = 1, Title = "タイトル1", Detail = "詳細1", Isedit = true }); 39 items.Add(new Item { Myid = 2, Title = "タイトル2", Detail = "詳細2", Isedit = true }); 40 items.Add(new Item { Myid = 3, Title = "タイトル3", Detail = "詳細3", Isedit = false }); 41 this.DataContext = items; 42 } 43 44 private void Button_Click(object sender, RoutedEventArgs e) 45 { 46 47 XmlSerializer serializer = new XmlSerializer(items.GetType()); 48 using (FileStream fs = new FileStream(Directory.GetCurrentDirectory() + "\\" + "mydata.xml", FileMode.Create)) 49 serializer.Serialize(fs, items); 50 } 51 52 private void Button_Click_1(object sender, RoutedEventArgs e) 53 { 54 XmlSerializer serializer = new XmlSerializer(items.GetType()); 55 using (FileStream fs = new FileStream(Directory.GetCurrentDirectory() + "\\" + "mydata.xml", FileMode.Open)) ; 56 //test = (Item)serializer.Deserialize(fs); 57 } 58 59 private void Button_Click_2(object sender, RoutedEventArgs e) 60 { 61 items.Add(new Item { Myid = 7, Title = "追加", Detail = "追加1", Isedit = true }); 62 } 63 } 64} 65
試したこと
エラーになったところをコメントアウトしてみましたが、何も変わりませんでした。
補足情報(FW/ツールのバージョンなど)
.Net Framework 4.7.2
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。