我有正确的源DataTable“sourceDataTable”,我调用方法将其拆分为多个并将结果存储到DataSet“ds”中:
DataSet ds = MyClass.SplitDataTables(sourceDataTable);
这是方法MyClass.SplitDataTables():
public static DataSet SplitDataTables(DataTable sourceDataTable)
{
using (DataSet dsOut = new DataSet())
{
DataTable dt1 = new DataTable;
DataTable dt2 = new DataTable;
DataTable dt3 = new DataTable;
dt1 = sourceDataTable.Clone();
dt2 = sourceDataTable.Clone();
dt3 = sourceDataTable.Clone();
foreach (DataRow row in sourceDataTable.Rows)
{
//column is for example "City" and some row has "Boston" in it, so I put this row into dt1
if (row["ColumnName"].ToString() == "something")
{
dt1.ImportRow(row);
}
else if (...)
{ } //for other DataTables dt2, dt3, etc...
else .......... ;
}
//here I put resulting DataTables into one DataSet which is returned
string[] cols= { "dt1", "dt2", "dt3" };
foreach (string col in cols)
{
dsOut.Tables.Add(col);
}
return dsOut;
}
}
因此,使用此返回的DataSet,我将使用一个DataTable显示新的Windows
foreach (DataTable dtt in ds.Tables)
{
string msg = dtt.TableName;
Window2 win2 = new Window2(dtt, msg);
win2.Show();
}
所有我看到的是带有“空DataGrid”占位符的Windows Windows代码是正确的,因为它适用于“unsplit DataTable”。
我认为拆分DataTables中的代码都是错误的,因为它不会输出带有填充DataTables的DataSet。我将非常感谢对此问题的任何帮助。谢谢!
答案 0 :(得分:0)
你不需要在这里使用for循环
替换以下代码
string[] cols= { "dt1", "dt2", "dt3" };
foreach (string col in cols)
{
dsOut.Tables.Add(col);
}
有了这个
dsOut.Tables.Add(dt1);
dsOut.Tables.Add(dt2);
dsOut.Tables.Add(dt3);
答案 1 :(得分:0)
感谢@Krishna,我解决了这个问题。因此,如果您遇到过类似的问题,请注意以下两点:
string[] cols = { "dt1", "dt2", "dt3", ... };
foreach (string col in cols)
{
dsOut.Tables.Add(col);
}
此循环无法访问具有相同名称的DataTables对象,并且只将空DataTable写入DataSet集合(无论名称相同!)。
如果你创建了新的DataTable,并且你将把它作为另一个DataTable的克隆,那么就不用费心去设置它的名字了。
DataTable dt1 = new DataTable();
制作与源DataTable格式相同的新DataTable:
dt1 = sourceDataTable.Clone();
dt2 = sourceDataTable.Clone();
//etc...
现在,您必须为从源DataTable克隆的每个DataTable设置唯一的DataTable名称:
dt1.TableName = "Name1";
dt2.TableName = "Name2";
//and so on
现在一切正常。