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

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

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

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

WPF

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

Q&A

解決済

2回答

6345閲覧

DataGridでXMLファイルを表のように表示したい

mknji

総合スコア19

C#

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

WPF

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

0グッド

0クリップ

投稿2019/04/16 13:48

編集2019/04/17 10:32

XML形式のデータを表形式で表示したいです。

C#

1 XDocument xml = XDocument.Parse(xmlstr); 2 XElement table = xml.Element("hogeテーブル"); 3 var rows = table.Elements("hoge要素"); 4 datagrid.ItemsSource = rows;

とりあえず書いてみましたが、

C#

1datagrid.ItemsSource = rows;

の部分で型が違いますとコンパイルエラーになります。

XMLのテーブルは一つしかないのでどうでもいいのですが、要素ごとに列で、データごとに行で表示したいです。

別にDataGridでなくてもいいですが、いろいろ調べた結果いちばん良いかなと思った次第です。
CSVファイルを表形式で表示する記事は見つけられましたが、XMLを表形式にするのはいくら調べても出てきません。
よろしくおねがいします。

追記:XMLのサンプルです。

XML

1<?xml version="1.0" encoding="utf-8" ?> 2<パスワードリスト> 3 <Data> 4 <ID>01</ID> 5 <LoginID>suzumiyaharuhi</LoginID> 6 <PassWord>SOSOS</PassWord> 7 <備考>ただの人間に興味ありません</備考> 8 </Data> 9</パスワードリスト>

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

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

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

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

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

hihijiji

2019/04/16 16:14

XMLのサンプルと出力したい表の画像を提示してください。
退会済みユーザー

退会済みユーザー

2019/04/16 21:35

WPF は必須ですか? (Windowds Forms アプリで DataGridView という選択肢はない?)
mknji

2019/04/17 12:22 編集

@hihijiji 質問&ご指摘ありがとうございます。XMLのサンプルを追記しておきます
mknji

2019/04/17 12:23 編集

@SurferOnWww なるべくならWPF縛りで作りたいと考えています。(確かにDataGridViewの方法を見かけました) 調べても出てこないということは、あまりスタンダードなやり方ではないということでしょうか…
guest

回答2

0

ベストアンサー

表示するだけでよければ、DataSet.ReadXml メソッドで DataSet に取り込んで、DataTable.DefaultView プロパティで DataView を取得し、それを DataGrid.ItemsSource に設定してやれば良いはずです。

具体的には、デザイナ画面で DataGrid を MainWindow にドラッグ&ドロップして、以下のコードを書いてみてください。

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 { public MainWindow() { InitializeComponent(); System.Data.DataSet dataset = new System.Data.DataSet(); dataset.ReadXml(@"C:\Users...\withschema.xml"); dataGrid.ItemsSource = dataset.Tables[0].DefaultView; } } }

例えば、上のコードの @"C:\Users...\withschema.xml" で指定されたパスにある xml ファイルが以下のようになっているとすると(スキーマ付きです)、

<?xml version="1.0" standalone="yes"?> <NewDataSet> <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="Table1"> <xs:complexType> <xs:sequence> <xs:element name="ID" type="xs:int" minOccurs="0" /> <xs:element name="Name" type="xs:string" minOccurs="0" /> <xs:element name="Price" type="xs:decimal" minOccurs="0" /> <xs:element name="Discontinued" type="xs:boolean" minOccurs="0" /> <xs:element name="Date" type="xs:dateTime" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> </xs:element> </xs:schema> <Table1> <ID>0</ID> <Name>Product Name_0</Name> <Price>123000</Price> <Discontinued>true</Discontinued> <Date>2018-10-21T10:40:52.1215882+09:00</Date> </Table1> <Table1> <ID>1</ID> <Name>Product Name_1</Name> <Price>246000</Price> <Discontinued>false</Discontinued> <Date>2018-10-22T10:40:52.1225475+09:00</Date> </Table1> ・・・中略・・・ <Table1> <ID>14</ID> <Name>Product Name_14</Name> <Price>1845000</Price> <Discontinued>true</Discontinued> <Date>2018-11-04T10:40:52.1225475+09:00</Date> </Table1> </NewDataSet>

結果は以下のようになります。

イメージ説明

投稿2019/04/17 04:29

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

mknji

2019/04/17 12:32 編集

回答ありがとうございます。 逆に、DataGridの内容をXMLにする場合はどうすればよいのでしょうか。 DataTable.DefaultViewは読み取り専用ですよね... 質問の仕方が悪くて申し訳ないです...
退会済みユーザー

退会済みユーザー

2019/04/17 13:32

ユーザーが DataGrid に表示されたデータを編集して結果を xml ファイルに書き戻したいということですか? Windows Forms + DataGridView の場合は DataSet.WriteXml メソッドで可能ですが WPF + DataGrid の場合は試したことがないので分かりません。すみませんが、編集とデータの保存については、新たにスレッドを立てて質問していただければと思います。
guest

0

具体的な XML のフォーマットがわからないので適当ですが、こんな感じでしょうか。
単純に行単位のデータ(Person)のコレクションを ItemsSource に設定しているだけです。

XML

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

C#

1//MainWindowViewModel.cs 2using System; 3using System.Collections.Generic; 4using System.ComponentModel; 5using System.IO; 6using System.Linq; 7using System.Reflection; 8using System.Xml.Linq; 9using XmlTest.Models; 10 11namespace XmlTest.ViewModels { 12 class MainWindowViewModel: INotifyPropertyChanged { 13 public event PropertyChangedEventHandler PropertyChanged; 14 15 public IEnumerable<Person> Items { get; } 16 17 public MainWindowViewModel() { 18 var xmlFile = @"...\XmlTest.xml"; 19 20 var xml = XDocument.Load( xmlFile ); 21 var table = xml.Root.Element( "Person" ); 22 var rows = table.Elements( "Row" ); 23 this.Items = rows.Select( row => new Person() { 24 Name = row.Element( "Name" ).Value, 25 Age = row.Element( "Age" ).Value, 26 Gender = row.Element( "Gender" ).Value 27 } ); 28 } 29 } 30} 31 32namespace XmlTest.Models { 33 class Person { 34 public string Name { get; set; } 35 public string Age { get; set; } 36 public string Gender { get; set; } 37 } 38 39}

XAML

1<!-- MainWindow.xaml --> 2<Window x:Class="XmlTest.Views.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 7 xmlns:local="clr-namespace:XmlTest" 8 xmlns:vm="clr-namespace:XmlTest.ViewModels" 9 mc:Ignorable="d" 10 Title="MainWindow" Height="450" Width="800"> 11 12 <Window.DataContext> 13 <vm:MainWindowViewModel /> 14 </Window.DataContext> 15 16 <Grid> 17 <DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False"> 18 <DataGrid.Columns> 19 <DataGridTextColumn Header="名前" Binding="{Binding Name}" /> 20 <DataGridTextColumn Header="年齢" Binding="{Binding Age}" /> 21 <DataGridTextColumn Header="性別" Binding="{Binding Gender}" /> 22 </DataGrid.Columns> 23 </DataGrid> 24 </Grid> 25</Window>

投稿2019/04/16 23:26

draq

総合スコア2573

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

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

mknji

2019/04/17 11:42

ご回答ありがとうございます。どちらもBAにしたかったのですが、システム上できないのが悔やまれます。 役立たせていただきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問