トップ回答者
DataGridViewとXMLファイル

質問
-
開発環境:VS2005
お世話になります。
DataGridViewにXMLファイルのデータを表示する方法についてお聞きしたいのですが、
検索をして、
http://msdn2.microsoft.com/ja-jp/library/ekw4dh3f(VS.80).aspx
のページのチュートリアルに従って、DataGridViewにXMLファイルのデータを表示する方法ができました。
チュートリアルのサンプルでは、XMLファイルを読み込んでDataGridViewに表示すると、テーブル構造(ColumnHeader)とカラムのデータの両方が表示されます。やりたいこととしましては、DataGridViewにあらかじめテーブル構造は設定・表示しておいて、ボタンをクリックするとXMLファイルのデータだけをテーブル構造(ColumnHeader)の各項目にあった列に表示したいと考えております。
わかりにくい説明で申し訳ございませんが、宜しくお願いします。
回答
-
デザイナでdataGridViewのデザインを行いたいということでしょうか? いまいち,目標とするところが理解できていませんが,次のような手順ではどうですか。
(1)ソリューションエクスプローラでプロジェクトを選択し,右クリックし「追加」→「既存の項目」を選択し,authors.xsdを選びます。(authors.xsdは,以前に作成した自前のスキーマ名です。別名で作成した場合はそれを選択してください。)
(2)Form(デザイン)を表示し,dataGridViewを選択し,プロパティのDataSourceの↓をクリックし,「他のデータソース」→「authors]を選択します。authors_Table, authorsBindingSourceの各コンポーネントが自動的に追加されます。
(3)これで,dataGridViewにテーブルの項目が表示されますから,列の編集などで思うように列の表示方法などを設定してください。
(4)コードの変更。ReadXmlButton_Clickを次のように変更します。
private void ReadXmlButton_Click(object sender, EventArgs e)
{
string filePath = "Complete path where you saved the XML file";
authors_Table.ReadXml(filePath);
}(5)実行すると,最初は,項目名だけのdataGridViewが表示され,ボタンをクリックするとデータが表示されます。
この手順は,デザイナを利用してdataGridViewを設定する場合の一般的な手順です。
すべての返信
-
テーブルの構造は,XMLスキーマで設定されますから,dataGridViewの表示を変更するにはXMLスキーマを変更する必要があります。
XMLファイルをdataSetで読み込むとXMLスキーマが推論され,チュートリアルではtextboxに表示されますので,これをコピーして,たとえばauthors.xsdというファイルとして保存し,このスキーマの要素出現順番を変更するとdataGridViewの表示順も変更されます。
dataGridViewの列名は,単に表示上だけの変更になりますが,スキーマの列名に応じてdataGridViewの列名表示の設定をしておきます。
チュートリアルの例の場合ですが,
コードに次のように付け加えます
AuthorsDataSet.ReadXmlSchema("xsdファイルのpath\\authors.xsd")
AuthorsDataSet.ReadXml(filePath)
DataGridView1.DataSource = AuthorsDataSet
DataGridView1.DataMember = "authors"
//内部的な列名に対し表示する列ヘッダー名を設定します
DataGridView1.Columns["au_id"].HeaderCell.Value = "IDです";
DataGridView1.Columns["phone"].HeaderCell.Value = "電話";
DataGridView1.Columns["address"].HeaderCell.Value = "住所";XMLスキーマの次の部分の要素出現順番を表示の順番に変更して,authors.xsdとして保存しておきます。
<xs:sequence>
<xs:element name="address" type="xs:string" minOccurs="0" />
<xs:element name="au_lname" type="xs:string" minOccurs="0" />
<xs:element name="au_fname" type="xs:string" minOccurs="0" />
<xs:element name="city" type="xs:string" minOccurs="0" />
<xs:element name="state" type="xs:string" minOccurs="0" />
<xs:element name="phone" type="xs:string" minOccurs="0" />
<xs:element name="zip" type="xs:string" minOccurs="0" />
<xs:element name="contract" type="xs:string" minOccurs="0" />
<xs:element name="au_id" type="xs:string" minOccurs="0" />
</xs:sequence>多分,このようなことで可能かと思いますが,できるだけXMLデータを設定する際にdataGridViewでの表示を考えて構成したほうがトラブルが少ないと思います。チュートリアルのような単純なXMLデータならともかく,子要素があってリレーション関係が存在する場合などどうなんでしょうか。
-
ke1様有難うございます。
textboxに表示されるXMLスキーマをコピーして、authors.xsdというファイル名で保存しました。
次の作業としまして、コードを付け加えるところなのですが、
ke1 さんからの引用
コードに次のように付け加えますAuthorsDataSet.ReadXmlSchema("xsdファイルのpath\\authors.xsd")
AuthorsDataSet.ReadXml(filePath)
DataGridView1.DataSource = AuthorsDataSet
DataGridView1.DataMember = "authors"
//内部的な列名に対し表示する列ヘッダー名を設定します
DataGridView1.Columns["au_id"].HeaderCell.Value = "IDです";
DataGridView1.Columns["phone"].HeaderCell.Value = "電話";
DataGridView1.Columns["address"].HeaderCell.Value = "住所";
これらのコードは具体的にどの箇所に付け加えればよろしいでしょうか?基本的な質問で申し訳ございません。
-
チュートリアルの手順を前提なのですが,
3. ReadXmlButton_Click イベント ハンドラ内に次のコードを入力します。
というところにサンプルコードがありますから,そこのコードに
AuthorsDataSet.ReadXmlSchema("xsdファイルのパス\\authors.xsd");
という,XMLスキーマを読み込むコードと(ReadXmlの前に置きます),dataGridView1.Columns["au_id"].HeaderCell.Value = "IDです";
などの,ヘッダーセルの表示を設定するコードを追加します(DataMember設定の後に置きます)。追加後のコードは次のようになります(先の投稿は,VBとC#がごちゃごちゃになっていました。すみません)
private void ReadXmlButton_Click(object sender, EventArgs e)
{
string filePath = "xmlファイルのパス\\XML file名";
AuthorsDataSet.ReadXmlSchema("xsdファイルのパス\\authors.xsd");
AuthorsDataSet.ReadXml(filePath);
dataGridView1.DataSource = AuthorsDataSet;
dataGridView1.DataMember = "authors";
dataGridView1.Columns["au_id"].HeaderCell.Value = "IDです";
dataGridView1.Columns["phone"].HeaderCell.Value = "電話";
dataGridView1.Columns["address"].HeaderCell.Value = "住所";
}なお,XMLスキーマファイル(authors.xsd)ですが,推論されたスキーマでは,エンコードがutf-16になっていると思います。utf-16で編集できるエディタなら問題はありませんが,私の場合はutf-8で編集していますので,xsdファイルの先頭行のencoding="utf-16"をencoding="utf-8"と訂正しています。
-
返事が遅くなってしまい申し訳ございません。
アドバイスを元に作業をして、無事にヘッダー名とxmlファイルを対応できました。
有難うございました。現状では、ReadXmlButtonをクリックすると、新しくカラムを作成してしまいます。
そこで、dataGridViewを選択してプロパティウインドウの、「列の追加」から Name を au_id に設定をしてカラムを追加します。
そして、ReadXmlButtonをクリックしてauthors.xmlの au_id のデータを「列の追加」で設定した au_id のカラムに挿入したいと考えております。もし宜しければお願いいたします。
-
デザイナでdataGridViewのデザインを行いたいということでしょうか? いまいち,目標とするところが理解できていませんが,次のような手順ではどうですか。
(1)ソリューションエクスプローラでプロジェクトを選択し,右クリックし「追加」→「既存の項目」を選択し,authors.xsdを選びます。(authors.xsdは,以前に作成した自前のスキーマ名です。別名で作成した場合はそれを選択してください。)
(2)Form(デザイン)を表示し,dataGridViewを選択し,プロパティのDataSourceの↓をクリックし,「他のデータソース」→「authors]を選択します。authors_Table, authorsBindingSourceの各コンポーネントが自動的に追加されます。
(3)これで,dataGridViewにテーブルの項目が表示されますから,列の編集などで思うように列の表示方法などを設定してください。
(4)コードの変更。ReadXmlButton_Clickを次のように変更します。
private void ReadXmlButton_Click(object sender, EventArgs e)
{
string filePath = "Complete path where you saved the XML file";
authors_Table.ReadXml(filePath);
}(5)実行すると,最初は,項目名だけのdataGridViewが表示され,ボタンをクリックするとデータが表示されます。
この手順は,デザイナを利用してdataGridViewを設定する場合の一般的な手順です。
-
有難うございます!
とてもわかりやすい説明で、実現できました。
大変お世話になりました!!
- 回答の候補に設定 tanaka takasi 2011年5月10日 9:37