0

問題の説明:

私はDataGridを持っています。Listによって入力されています。そのためのコードは次のとおりです。

List<SomeClass> someClassList = new List<SomeClass>();
//Fill somClassList with data (omited for brevity)
myDataGrid.ItemsSource = someClassList;

これは機能し、すべての値が正しく表示されます。ユーザーはすべてのセルを編集して、新しい行を作成できます。ユーザーがいくつかのボタンをクリックした後、そのDataGrid内のを次の構造のXMLファイルに保存します。

<Root>
    <a>
        <b>val1</b>
        <c>val2</c>
        <d>
            <e>
                <f>val3</f>
                <g>val4</g>
                <h>val5</h>
                <i>val6</i>
            </e>
            <!--variable number of 'e'- tags with inner structure as above-->
        </d>
     </a>
     <!--variable number of 'a'-tags with inner structure as above-->
</Root>

このため、DataGrid を行ごとに繰り返し処理するのが賢明であると判断しました。したがって、Button-Click-event-Handler には反復を実行するコードが含まれています(すべての値は WriteLine() メソッドによって再現されます)。

foreach (SomeClass someClassElement in myDataGrid.ItemsSource)
{
    Trace.WriteLine(someClassElement.b+ ", " + someClassElement.c+ ", " +
                    someClassElement.f + ", " + someClassElement.g + ", " +
                    someClassElement.h + ", " + someClassElement.i);
}

各行をXML ファイルに書き込む必要があります残念ながら、これは簡単な作業ではないようです。出現回数が可変の内部タグが 2 つあるからです。

これまでに得たのは次のコードです。これは、わかりやすくするために追加したサンプル DataGridから同様に追加されたXML ファイルを生成します。

//Button click code
XmlDocument doc = new XmlDocument();
XmlNode myRoot = doc.CreateElement("Root");
XmlNode a,b,c,d,e;
String last_b_value = "0";
foreach (SomeClass someClassElement in myDataGrid.ItemsSource)
{
    String current_b_value = someClassElement.b;
    if (last_b_value != current_b_value)
    {
        //Creating XML-elements and setting text
        a = doc.CreateElement("a");
        b = doc.CreateElement("b");
        b.InnerText = someClassElement.b;
        c = doc.CreateElement("c");
        c.InnerText = someClassElement.c;
        d = doc.CreateElement("d");
        e = doc.CreateElement("e");

        a.AppendChild(b);
        a.AppendChild(c);
        a.AppendChild(d);
        d.AppendChild(e);
    }
}
doc.AppendChild(myRoot);
// Save document
string filename = dlg.FileName;
doc.Save(@filename);

出力された XML ファイルは次のとおりです。

<root>
  <a>
    <b>val_1_1</b>
    <c>val_1_2</c>
    <d>
      <e />
      <!-- the varying number of 'e'-tags is not created correctly -->
    </d>
  </a>
  <a>
    <b>val_2_1</b>
    <c>val_2_2</c>
    <d>
      <e />
      <!-- the varying number of 'e'-tags is not created correctly -->
    </d>
  </a>
  <a>
     <b>val_3_1</b>
     <c>val_3_2</c>
     <d>
       <e />
       <!-- the varying number of 'e'-tags is not created correctly -->
     </d>
  </a>
  <!-- number of varying 'a'-tags is created correctly -->
</root>

そして、ここにがあります-ユーザーがボタンをクリックした後にXMLファイルが作成されるDataGrid :

例-Datagrid

コードは可変数の「a」タグを適切に処理しますが、各「a」タグ内に可変数の「e」タグも書き込む機能がありません。

代わりに、出力XML ファイルは次のようになります

<Root>
  <a>
    <b>val_1_1</b>
    <c>val_1_2</c>
    <d>
          <e>
          <f>x1</f>
          <g>x1</g>
          <h>x1</h>
          <i>x1</i>
      </e>
      <e>
          <f>x2</f>
          <g>x2</g>
          <h>x2</h>
          <i>x2</i>
      </e>
      <e>
          <f>x3</f>
          <g>x3</g>
          <h>x3</h>
          <i>x3</i>
      </e>
    </d>
  </a>
  <a>
    <b>val_2_1</b>
    <c>val_2_2</c>
    <d>
      <e>
          <f>x4</f>
          <g>x4</g>
          <h>x4</h>
          <i>x4</i>
      </e>
      <e>
          <f>x5</f>
          <g>x5</g>
          <h>x5</h>
          <i>x5</i>
      </e>
    </d>
  </a>
  <a>
    <b>val_3_1</b>
    <c>val_3_2</c>
    <d>
      <e>
          <f>x6</f>
          <g>x6</g>
          <h>x6</h>
          <i>x6</i>
      </e>
    </d>
  </a>
</Root>

質問:

  1. 欠落している「e」タグを作成するためにコードをどのように適応させることができますか?
  2. DataGridを読み取り、その値を同じ構造化 XML ファイルに保存するよりスマートな方法はありますか?
4

1 に答える 1