none
DataGridViewとXMLファイル RRS feed

  • 質問

  • 開発環境:VS2005

    お世話になります。

    DataGridViewにXMLファイルのデータを表示する方法についてお聞きしたいのですが、
    検索をして、
    http://msdn2.microsoft.com/ja-jp/library/ekw4dh3f(VS.80).aspx
    のページのチュートリアルに従って、DataGridViewにXMLファイルのデータを表示する方法ができました。


    チュートリアルのサンプルでは、XMLファイルを読み込んでDataGridViewに表示すると、テーブル構造(ColumnHeader)とカラムのデータの両方が表示されます。

    やりたいこととしましては、DataGridViewにあらかじめテーブル構造は設定・表示しておいて、ボタンをクリックするとXMLファイルのデータだけをテーブル構造(ColumnHeader)の各項目にあった列に表示したいと考えております。


    わかりにくい説明で申し訳ございませんが、宜しくお願いします。

    2006年12月17日 16:50

回答

  • デザイナで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を設定する場合の一般的な手順です。

     

    2006年12月22日 11:43

すべての返信

  • DataGridViewのAutoGenerateColumnsをfalseにして、自分でカラムを追加しておけば良いのではないでしょうか?

    2006年12月18日 0:55
    モデレータ
  • テーブルの構造は,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データならともかく,子要素があってリレーション関係が存在する場合などどうなんでしょうか。

     

    2006年12月18日 5:50
  • 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 = "住所";



    これらのコードは具体的にどの箇所に付け加えればよろしいでしょうか?

    基本的な質問で申し訳ございません。

    2006年12月18日 12:44
  • チュートリアルの手順を前提なのですが,

          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"と訂正しています。

     

    2006年12月18日 13:38
  • お早いお返事有難うございます。

    アドバイスをもとに早速試してみます。

    出来次第また書き込みたいと思います。

    2006年12月18日 14:08
  • 返事が遅くなってしまい申し訳ございません。

    アドバイスを元に作業をして、無事にヘッダー名とxmlファイルを対応できました。
    有難うございました。

    現状では、ReadXmlButtonをクリックすると、新しくカラムを作成してしまいます。
    そこで、dataGridViewを選択してプロパティウインドウの、「列の追加」から Name を au_id に設定をしてカラムを追加します。
    そして、ReadXmlButtonをクリックしてauthors.xmlの au_id のデータを「列の追加」で設定した au_id のカラムに挿入したいと考えております。

    もし宜しければお願いいたします。

    2006年12月22日 8:41
  • デザイナで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を設定する場合の一般的な手順です。

     

    2006年12月22日 11:43
  • 有難うございます!

    とてもわかりやすい説明で、実現できました。

    大変お世話になりました!!

    2006年12月22日 12:30