C# 带XML的DataGridView-“;“合并”;儿童档案

C# 带XML的DataGridView-“;“合并”;儿童档案,c#,xml,datagridview,C#,Xml,Datagridview,我有一个简单的Windows窗体应用程序,其中我正在读取XML文件并在DataGridView中显示其内容: DataSet ds = new DataSet(); private void Form1_Load(object sender, EventArgs e) { ds.ReadXmlSchema(@"MySchema.xsd"); ds.ReadXml(@"MyXML.xml"); dataGridView1.D

我有一个简单的Windows窗体应用程序,其中我正在读取XML文件并在DataGridView中显示其内容:

DataSet ds = new DataSet();

private void Form1_Load(object sender, EventArgs e)
{
    ds.ReadXmlSchema(@"MySchema.xsd");
    ds.ReadXml(@"MyXML.xml");                       

    dataGridView1.DataSource = ds.Tables[0];
}
这会很好地加载父记录。但是,我有一个可选的子记录(位于
ds.Tables[1]
),我想将其与dataGridView一起加载-要么在它自己的网格中,要么只是显示在
表[0]
中的数据旁边

我尝试了几种不同的方法,包括添加第二个DataGridView:

DataSet ds = new DataSet();

private void Form1_Load(object sender, EventArgs e)
{
    ds.ReadXmlSchema(@"MySchema.xsd");
    ds.ReadXml(@"MyXML.xml");                       

    dataGridView1.DataSource = ds.Tables[0];
}
dataGridView2.DataSource=ds.Tables[1]-这确实显示了数据,但没有指示它实际属于哪个父记录

合并记录:
ds.Tables[0]。合并(ds.Tables[1])-如我所愿显示数据,在特定行不包含此信息的地方使用空格。但是,当我保存数据时,它有一个副作用,那就是将所有内容写入
表[0]
,这是我不希望发生的

我只想并排显示这些数据(模拟
合并
操作的效果,但继续写入各自的行)

我目前正在使用
ds.WriteXml(@“Path”);
编写数据。 谁能给我指一下正确的方向吗

编辑:

XML文件的基本布局为:

<parent>
  <child1 property1="" property2="">
    <optionalchild property1="" property2="" />
  </child1>
  <child2 property1="" property2="" />
  .. etc
</parent>

您可以使用XML Linq像这样解析XML文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;


namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            var results = doc.Element("parent").Elements().Select(x => new
            {
                name = x.Name,
                property1 = x.Attribute("property1").Value,
                property2 = x.Attribute("property2").Value,
                child_property1 = x.Element("optionalchild") == null ? null : x.Element("optionalchild").Attribute("property1").Value,
                child_property2 = x.Element("optionalchild") == null ? null : x.Element("optionalchild").Attribute("property2").Value
            }).ToList();

        }
    }
}
​

虽然这是一个选项,但我正试图像上面那样继续这样做,以避免做所有这些事情(如果我添加列,则更改代码,等等)。按照我当前加载它的方式,我已经得到了数据关系和子表。我需要的一切都在那里,我只是无法让它正确显示。我最近读到DataGridView显然不支持这一点,所以我正在寻找替代方法。表的制作副本:DataTable dt=ds.Tables[0]。copy();dt.Merge(ds.Tables[1]);这似乎缓解了在DataGridView中显示它的问题,但我如何将每个表写回各自的位置?合并的问题是它将输出转换为
。您介意用这个方法更新您的答案吗?我想知道是否使用GroupBy()而不是合并()可以。您可以显示GroupBy的结果,该结果将创建返回原始数据集的符号链接。这样,当您更改数据时,原始数据集可以以相同的格式保存。除非我能够为我的方法找到正确的解决方案,否则我决定接受您的答案,因为它将完全执行我尝试执行的操作,即使这并不是那么“简单”。非常感谢你的帮助!检查一下这个作为一个替代方案,你可以在VB中转换成C#。我用于繁重的工作,手动修复了错误,并且不得不将我自己的expand/collapse.png添加到
MasterControl.cs[Design]
RowHeaderIconList.Images
collection.@OhBeWise噢,天哪,那很漂亮。我得去看看。谢谢!