Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将嵌套对象绑定到DataGridView BindingSource_C#_Xml_Winforms_Datagridview - Fatal编程技术网

C# 将嵌套对象绑定到DataGridView BindingSource

C# 将嵌套对象绑定到DataGridView BindingSource,c#,xml,winforms,datagridview,C#,Xml,Winforms,Datagridview,我有一个XML文件,可以使用以下代码绑定到DataGridView: XML <entity> <primitive name"Name1" type="Type1" index="Index1" nullable="true" isKey="false" /> <primitive name"Name2" type="Type2" index="Index2" nullable="true" isKey="false" /> </en

我有一个XML文件,可以使用以下代码绑定到DataGridView:

XML

<entity>
    <primitive name"Name1" type="Type1" index="Index1" nullable="true" isKey="false" />
    <primitive name"Name2" type="Type2" index="Index2" nullable="true" isKey="false" />
 </entity>
现在的问题实际上是用XML中property.name的值填充这个DataGridView

只是想给你一个想法,这就是这个类的结构

public class Entity
{
    public Collection<Primitive> Primitives;
    public Collection<StaticData> StaticData;
}

public class StaticData
{
    public Collection<Records> Records;
}

public class Records
{
    public Collection<Record> Record;
}

public class Record
{
    public Collection<Property> Property;
}
这就是结果:

StartDate    |     EndDate    |     Description    |    Name        |    Value
             |                |                    |    StartDate   |    04/04/2017
             |                |                    |    EndDate     |    04/04/2017
             |                |                    |    Description |    Very Good

您可以看到它添加了新列并填充了行,而不是填充我创建的列的行。

您可以绑定到
数据表。您将能够从对象数组生成列,这些对象可以来自您的
name
属性

// populate DataTable columns
DataTable dt = new DataTable();
Collection<Property> properties = entity
    .StaticData.FirstOrDefault()
    .Records.FirstOrDefault()
    .Record.FirstOrDefault()
    .Property;
// from the collection of xml name attributes in the first record
dt.Columns.AddRange(properties.Select(p => new DataColumn(p.Name)).ToArray());

// populate DataTable rows
Collection<Record> records = entity
    .StaticData.FirstOrDefault()
    .Records.FirstOrDefault()
    .Record;
// create a row from each record, with the values from the xml value attribute
foreach (Record r in records)
{
    dt.Rows.Add(r.Property.Select(p => p.Value).ToArray());
}

// bind to the datatable
dataGridView1.DataSource = dt;
//填充数据表列
DataTable dt=新的DataTable();
集合属性=实体
.StaticData.FirstOrDefault()
.Records.FirstOrDefault()
.Record.FirstOrDefault()文件
.财产;
//来自第一条记录中的xml名称属性集合
dt.Columns.AddRange(properties.Select(p=>newdatacolumn(p.Name)).ToArray();
//填充数据表行
收集记录=实体
.StaticData.FirstOrDefault()
.Records.FirstOrDefault()
.记录;
//使用xml值属性中的值从每个记录创建一行
foreach(记录中的记录r)
{
Add(r.Property.Select(p=>p.Value.ToArray());
}
//绑定到数据表
dataGridView1.DataSource=dt;

请注意,这些列是从第一条记录生成的,正如您所做的那样。然后我假设第一条记录的属性与所有其他记录的属性相同。

您可以绑定到
数据表。您将能够从对象数组生成列,这些对象可以来自您的
name
属性

// populate DataTable columns
DataTable dt = new DataTable();
Collection<Property> properties = entity
    .StaticData.FirstOrDefault()
    .Records.FirstOrDefault()
    .Record.FirstOrDefault()
    .Property;
// from the collection of xml name attributes in the first record
dt.Columns.AddRange(properties.Select(p => new DataColumn(p.Name)).ToArray());

// populate DataTable rows
Collection<Record> records = entity
    .StaticData.FirstOrDefault()
    .Records.FirstOrDefault()
    .Record;
// create a row from each record, with the values from the xml value attribute
foreach (Record r in records)
{
    dt.Rows.Add(r.Property.Select(p => p.Value).ToArray());
}

// bind to the datatable
dataGridView1.DataSource = dt;
//填充数据表列
DataTable dt=新的DataTable();
集合属性=实体
.StaticData.FirstOrDefault()
.Records.FirstOrDefault()
.Record.FirstOrDefault()文件
.财产;
//来自第一条记录中的xml名称属性集合
dt.Columns.AddRange(properties.Select(p=>newdatacolumn(p.Name)).ToArray();
//填充数据表行
收集记录=实体
.StaticData.FirstOrDefault()
.Records.FirstOrDefault()
.记录;
//使用xml值属性中的值从每个记录创建一行
foreach(记录中的记录r)
{
Add(r.Property.Select(p=>p.Value.ToArray());
}
//绑定到数据表
dataGridView1.DataSource=dt;

请注意,这些列是从第一条记录生成的,正如您所做的那样。然后我假设第一条记录的属性与所有其他记录的属性相同。

这些记录与原语的关系如何?是否尝试在同一DataGridView上同时显示这两个视图?这些记录是否总是有三个属性,如上文所述的StartDate、EndDate和Description,或者可能有更多或更少的属性?@djv在
原语
记录
之间没有关系。
staticData.records.record
应显示在单独的datagridview上。因此,1记录对象=datagrdiview中的1行。
可以有任意数量的
有点离题,但在制定答案时,考虑到集合的名称是单数而不是复数,这有点让人困惑。例如,
公共集合属性
应被称为
属性
。如果xml序列化有问题,可以使用别名作为元素名称,即
[xmlement(“property”)]公共集合属性
记录与原语的关系如何?是否尝试在同一DataGridView上同时显示这两个视图?这些记录是否总是有三个属性,如上文所述的StartDate、EndDate和Description,或者可能有更多或更少的属性?@djv在
原语
记录
之间没有关系。
staticData.records.record
应显示在单独的datagridview上。因此,1记录对象=datagrdiview中的1行。
可以有任意数量的
有点离题,但在制定答案时,考虑到集合的名称是单数而不是复数,这有点让人困惑。例如,
公共集合属性
应被称为
属性
。如果xml序列化有问题,可以使用别名作为元素名称,即
[xmlement(“property”)]公共集合属性
 bindingSourceStaticData.DataSource = Entity.StaticData.FirstOrDefault().Records.FirstOrDefault().Record.FirstOrDefault().Property;
 dataGridViewStaticData.DataSource = bindingSourceStaticData;
StartDate    |     EndDate    |     Description    |    Name        |    Value
             |                |                    |    StartDate   |    04/04/2017
             |                |                    |    EndDate     |    04/04/2017
             |                |                    |    Description |    Very Good
// populate DataTable columns
DataTable dt = new DataTable();
Collection<Property> properties = entity
    .StaticData.FirstOrDefault()
    .Records.FirstOrDefault()
    .Record.FirstOrDefault()
    .Property;
// from the collection of xml name attributes in the first record
dt.Columns.AddRange(properties.Select(p => new DataColumn(p.Name)).ToArray());

// populate DataTable rows
Collection<Record> records = entity
    .StaticData.FirstOrDefault()
    .Records.FirstOrDefault()
    .Record;
// create a row from each record, with the values from the xml value attribute
foreach (Record r in records)
{
    dt.Rows.Add(r.Property.Select(p => p.Value).ToArray());
}

// bind to the datatable
dataGridView1.DataSource = dt;