我有一个DataGridView,我想填充从XML文件读取的数据,我从网络文件夹中读取。这些XML文件具有不同的模式,其中最复杂的模式类似于以下结构。
订单(属性1)
订单(属性2)(属性3)
行
行号 零件号 序列号
通过FileInfo.OpenText,XmlReader.Create和DataSet.ReadXML的组合将此数据读入内存。当DataSet.ReadXML执行时,我返回一个DataSet对象(名为“xmlContents”),其中包含三个DataTables:Orders,Order和Line。我希望将此数据绑定到我正在创建的Windows窗体应用程序中的单个DataGridView。
当我尝试将数据表合并在一起时,使用以下方法,我得到一个Null Reference Exception。
foreach (DataTable dt in xmlContents.Tables)
{
if (onFirstTable)
{
mergedTable = dt.Clone();
onFirstTable = false;
}
else
{
mergedTable.Merge(dt);
}
}
我已经检查了,并且三个不同的表之间存在ARE DataRelations。但是,列是系统生成的。有没有办法,也许使用LINQ,我可以返回一个DataSet,将这三个表中的数据合并为一个DataTable?我想以通用的方式做到这一点,而不必编写LINQ,如
from x join y join z
select x.Attribute1, y.Attribute2, y.Attribute3, z.LineNumber, z.PartNumber, z.SerialNumber
因为不同的文件具有不同的模式,并且我不知道系统生成的主键在构建时的名称。
编辑:我在确定了ystem生成的PK对于我的表之后,已经实现了LINQ查询。
IEnumerable<DataRow> query =
(from rpos in xmlContents.Tables[0].AsEnumerable()
join rpo in xmlContents.Tables[1].AsEnumerable()
on rpos.Field<object>("RPOs_Id") equals rpo.Field<object>("RPOs_Id")
join line in xmlContents.Tables[2].AsEnumerable()
on rpo.Field<object>("RPO_Id") equals line.Field<object>("RPO_Id")
select new { rpos, rpo, line }).Cast<DataRow>();
但是,在运行应用程序时,我收到以下错误:
无法将类型为'&lt;&gt; f__AnonymousType1`3 [System.Data.DataRow,System.Data.DataRow,System.Data.DataRow]'的对象强制转换为'System.Data.DataRow'。
答案 0 :(得分:0)
这是两张桌子,但您应该可以将它扩展为三张(采取宝贝步骤!):
//Create source tables
DataTable dt1 = new DataTable("Employees");
dt1.Columns.Add("EmployeeID", Type.GetType("System.Int32"));
dt1.Columns.Add("FirstName", Type.GetType("System.String"));
dt1.Columns.Add("LastName", Type.GetType("System.String"));
dt1.Columns.Add("BirthDate", Type.GetType("System.DateTime"));
dt1.Columns.Add("JobTitle", Type.GetType("System.String"));
dt1.Columns.Add("DepartmentID", Type.GetType("System.Int32"));
dt1.Rows.Add(new object[] { 1, "Tommy", "Hill", new DateTime(1970, 12, 31), "Manager", 42 });
dt1.Rows.Add(new object[] { 2, "Brooke", "Sheals", new DateTime(1977, 12, 31), "Manager", 23 });
dt1.Rows.Add(new object[] { 3, "Bill", "Blast", new DateTime(1982, 5, 6), "Sales Clerk", 42 });
dt1.Rows.Add(new object[] { 1, "Kevin", "Kline", new DateTime(1978, 5, 13), "Sales Clerk", 42 });
dt1.Rows.Add(new object[] { 1, "Martha", "Seward", new DateTime(1976, 7, 4), "Sales Clerk", 23 });
dt1.Rows.Add(new object[] { 1, "Dora", "Smith", new DateTime(1985, 10, 22), "Trainee", 42 });
dt1.Rows.Add(new object[] { 1, "Elvis", "Pressman", new DateTime(1972, 11, 5), "Manager", 15 });
dt1.Rows.Add(new object[] { 1, "Johnny", "Cache", new DateTime(1984, 1, 23), "Sales Clerk", 15 });
dt1.Rows.Add(new object[] { 1, "Jean", "Hill", new DateTime(1979, 4, 14), "Sales Clerk", 42 });
dt1.Rows.Add(new object[] { 1, "Anna", "Smith", new DateTime(1985, 6, 26), "Trainee", 15 });
DataTable dt2 = new DataTable("Departments");
dt2.Columns.Add("DepartmentID", Type.GetType("System.Int32"));
dt2.Columns.Add("DepartmentName", Type.GetType("System.String"));
dt2.Rows.Add(new object[] { 15, "Men's Clothing" });
dt2.Rows.Add(new object[] { 23, "Women's Clothing" });
dt2.Rows.Add(new object[] { 42, "Children's Clothing" });
var JoinedTables = from t1 in dt1.AsEnumerable()
join t2 in dt2.AsEnumerable() on t1["DepartmentID"] equals t2["DepartmentID"]
select new {
LastName = t1.Field<String>("LastName"),
DepartmentName = t2.Field<String>("DepartmentName")
};
GridView1.DataSource = JoinedTables;
GridView1.DataBind();