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

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

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

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

WPF

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

Q&A

解決済

3回答

1159閲覧

XMLのデータをDataGridで編集保存したい

mknji

総合スコア19

C#

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

WPF

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

0グッド

2クリップ

投稿2019/04/20 06:14

前提・実現したいこと

XMLにDataGridの内容を丸ごと保存する方法がいくら調べても出てきません
###わからないこと
・DataGridのItemsSourceまたはItemを取得し、それをXMLに書き出せない
・コード内のWriteXMLを呼び出すとCPUの利用率が100%を超え、メモリがキャパオーバーしてアプリがクラッシュする

2つ目のほうはWindow1を継承してるからなのか...と思いましたがよくわからないです(本題とは関係ないですが)

半日調べて試しましたが全くうまくいかず...どうすればよいかわかりません。ご教授願います
以下当該箇所のコードです。

C#

1 public partial class Window1 : Window 2 { 3 public Window1() 4 { 5 InitializeComponent(); 6 _datagrid.ItemsSource = new LoadXML().LoadItems; 7 new WriteXML(); 8 } 9 } 10 11 class LoadXML 12 { 13          //省略 14 } 15 16 class Person 17 { 18 public string Name { get; set; } 19 public string Age { get; set; } 20 public string Gender { get; set; } 21 } 22 23 class WriteXML :Window1 24 { 25 public WriteXML() 26 { 27 var DataGridItems =_datagrid.ItemsSource; 28 XElement xml = XElement.Load(@"test.xml"); 29 xml.Elements = DataGridItems; //ここでエラー 30 xml.Save(@"test.xml"); 31 } 32 } 33

XAML

1<Grid> 2 <DataGrid x:Name="_datagrid"></DataGrid> 3</Grid>

XML

1<?xml version="1.0" encoding="utf-8" ?> 2<XmlTest> 3 <Person> 4 <Row> 5 <Name>山田 太郎</Name> 6 <Age>25</Age> 7 <Gender>男</Gender> 8 </Row> 9 <Row> 10 <Name>鈴木 一郎</Name> 11 <Age>38</Age> 12 <Gender>男</Gender> 13 </Row> 14 <Row> 15 <Name>佐藤 花子</Name> 16 <Age>47</Age> 17 <Gender>女</Gender> 18 </Row> 19 </Person> 20</XmlTest>

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

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

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

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

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

guest

回答3

0

XMLからクラス作成はコピペで簡単に出来ます。
コードエディタを開いている状態でXMLをコピーし
[メニューバー]-[編集]-[形式を選択して貼り付け]-[XMLからクラスとして張り付ける]
で雛形が出来ます。
後は適当にリネームしたり、メソッドを追加します。
以下はシリアライズ、デシリアライズのメソッドを追加したものです。

C#

1using System; 2using System.IO; 3using System.Xml.Serialization; 4 5namespace WpfApp1 6{ 7 8 // メモ: 生成されたコードは、少なくとも .NET Framework 4.5または .NET Core/Standard 2.0 が必要な可能性があります。 9 /// <remarks/> 10 [Serializable()] 11 [System.ComponentModel.DesignerCategory("code")] 12 [XmlType(AnonymousType = true)] 13 [XmlRoot(Namespace = "", IsNullable = false)] 14 public partial class XmlTest 15 { 16 17 /// <remarks/> 18 [XmlArrayItem("Row", IsNullable = false)] 19 public XmlTestRow[] Person { get; set; } 20 21 public static XmlTest Deserialize(string fileName) 22 { 23 using (var stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read)) 24 { 25 var serializer = new XmlSerializer(typeof(XmlTest)); 26 return serializer.Deserialize(stream) as XmlTest; 27 } 28 } 29 30 public void Serialize(string fileName) 31 { 32 using (var stream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None)) 33 { 34 var serializer = new XmlSerializer(typeof(XmlTest)); 35 serializer.Serialize(stream, this); 36 } 37 } 38 } 39 40 /// <remarks/> 41 [Serializable()] 42 [System.ComponentModel.DesignerCategory("code")] 43 [XmlType(AnonymousType = true)] 44 public partial class XmlTestRow 45 { 46 47 /// <remarks/> 48 public string Name { get; set; } 49 50 /// <remarks/> 51 public byte Age { get; set; } 52 53 /// <remarks/> 54 public string Gender { get; set; } 55 } 56}

使うのはこんな感じで、

C#

1 public partial class MainWindow : Window 2 { 3 private string FileName => @"c:\test.xml"; 4 5 private XmlTest XmlTest { get; set; } 6 7 public MainWindow() 8 { 9 InitializeComponent(); 10 11 XmlTest = XmlTest.Deserialize(FileName); 12 dataGrid1.ItemsSource = XmlTest.Person; 13 } 14 15 void WriteXml() 16 { 17 XmlTest.Serialize(FileName); 18 } 19 }

投稿2019/04/20 07:34

編集2019/04/20 09:33
hihijiji

総合スコア4150

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

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

0

ベストアンサー

XMLにDataGridの内容を丸ごと保存する方法がいくら調べても出てきません

質問者さんの前のスレッド https://teratail.com/questions/184841 で私が回答した案の「DataGrid ⇔ DataSet ⇔ XML ファイル」という構造にすれば、DataGrid の編集結果が DataSet に反映されるので、編集後 DataSet.WriteXML メソッドで .xml ファイルに編集結果を書き戻すことができると思います。

ごく基本的な部分だけ書くと、前のスレッドのコードに Button 追加して、そのクリックイベントのハンドラに DataSet.WriteXML メソッドを書くという感じです。

参考に前のスレッドのコードに手を加えたものをアップしておきます。あくまで「XMLにDataGridの内容を丸ごと保存する」ためのごく基本的な部分だけです。(検証とか、例外処置とか全く考えていません。また、こういう方法が WPF + DataGrid アプリに適切かどうかは議論がありそうです)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace WpfApplication1 { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { private System.Data.DataSet dataset; string filePath = @"C:\Users...\withschema.xml"; public MainWindow() { InitializeComponent(); this.dataset = new System.Data.DataSet(); this.dataset.ReadXml(filePath); this.dataGrid.ItemsSource = dataset.Tables[0].DefaultView; } private void button_Click(object sender, RoutedEventArgs e) { this.dataset.WriteXml(filePath, System.Data.XmlWriteMode.WriteSchema); } } }

投稿2019/04/21 01:23

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ずっと思ってることですが、XML 主体なのがおかしいです。ちゃんとデータを表すクラスを作り、XML をデコードしてオブジェクトにしてバインドし、オブジェクトをエンコードして保存してください。

投稿2019/04/20 06:56

Zuishin

総合スコア28660

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問