1

それぞれ XML ファイルをロードする 2 つの dataGridView があり、各グリッド間で行をドラッグ アンド ドロップできるようにしました。ただし、現時点では、dataGridView からデータをコピーするだけです。これは問題なく動作しますが、その行に関連するすべての XML をコピーする必要があります。

これが私が使用しなければならない XML です。

<WindowBuilderProject>
  <stringtable>

    <stentry>0..607</stentry> //All of the other records

    <stentry>
      <index>608</index>
      <sid>MNUB_AUTO</sid>
      <val>
        <en>AUTO</en>
      </val>
      <params>
        <fontref>0</fontref>
        <numref>0</numref>
        <clip>FALSE</clip>
        <include>TRUE</include>
        <protected>FALSE</protected>
        <cwidth>-1</cwidth>
        <dwidth>0</dwidth>
      </params>
    </stentry>

  </stringtable>
</WindowBuilderProject>

したがって、ユーザーが選択した行の XML をコピーして、他の (同じ形式の) XML ドキュメントに挿入する必要があります。

これまでのところ、私はこれを持っています:

string location = "/WindowBuilderProject/stringtable/stentry[index='" + rowIndexOfItemUnderMouseToDrop + "']";
XmlNode Copy = xDoc.ImportNode(xDoc2.SelectSingleNode(location), false);
xDoc.DocumentElement.AppendChild(Copy); //This is just supposed to add it to the end, I will worry about ordering once it works

正常に実行されますが、XML ファイルの末尾に が追加されます。XML のブロック全体を選択するにはどうすればよいですか?

助けてくれてどうもありがとう!

4

3 に答える 3

4

要素のブロックを text1.xml から text2.xml にコピーするとします。LINQ to XML を使用できます。以下の例では、すべてのエントリを text1 から text2 にコピーすることを前提としています。

  var xDoc1 = XDocument.Load("C:\\text1.xml");
  var xDoc2 = XDocument.Load("C:\\text2.xml");

  var doc1Entries = xDoc1.Descendants("stentry");

  var cloneEntries = doc1Entries.Select(x => new XElement(x));
  xDoc2.Descendants("stentry").Last().AddAfterSelf(cloneEntries);

  xDoc2.Save("C:\\text2.xml");

Whereただし、メソッドを使用してフィルタリングして xml の一部を取得することもできます。以下のサンプルは、インデックスのリストを使用してフィルタリングすることです。

  var filterIndices = new[] {600, 601, 700, 705};

  var doc1Entries =
      xDoc1.Descendants("stentry")
           .Where(x =>         
               filterIndices.Contains(int.Parse(x.Element("index").Value)));

ここでは、 を使用して最後まで挿入することを想定してLastいますが、順序が気になる場合は、xDoc2 で LINQ を使用して正しい位置を見つけてから挿入できます。

于 2012-10-01T11:46:39.133 に答える
2

すべての XmlNode にはいくつかのメソッドがあり (XmlDocument は XmlNode の子クラスです)、xDoc.SelectNodes()またはxDoc.SelectSingleNode()を使用してドキュメント構造内の特定のノードを選択し、そのノードをオブジェクトに格納できます (それをneedleNodeと呼びます)、次にxDoc.InsertBefore(Copy, ref needleNode)またはxDoc.InsertAfter(Copy, ref needleNode) を実行します。これらの 4 つの関数を使用すると、2 番目の xml の構造の任意の部分に xml セクションを挿入できます。

于 2012-09-28T14:05:01.510 に答える
0

コントロールがデータバインドされている場合、DataGridView の行コレクションに行を追加/削除する必要はありません (実際にはこれを行うことはできません)。代わりに、それらを基になるデータソース コレクション (DataGridView の DataSource プロパティに設定するコレクション) に追加します。その後、両方の datagridviews のビューを更新して、変更を反映する必要があります。

于 2012-10-01T23:54:13.293 に答える