【发布时间】:2019-01-09 17:38:10
【问题描述】:
我有一个应用程序正在处理数据,该应用程序需要根据是否翻转来对数据进行排序。这些表完全相同。代码看起来像这样:
DataTable dt2 = dt1.Clone();
DataRow r = dt1.NewRow();
FillUp(ref r);
if(bitISetEarlier)
dt2.ImportRow(r);
else
dt1.ImportRow(r);
现在,我遇到的一个明显问题是,如果该行尚未附加到表格,ImportRow() 会静默失败,我最终会得到一个空表格。当我将其更改为:
if(bitISetEarlier)
dt2.Rows.Add(r);
else
dt1.Rows.Add(r);
我开始收到一个异常,说一个函数正在尝试为另一个表添加一个存在的行。所以当我尝试这个时:
if(bitISetEarlier)
if(r.RowState == DataRowState.Detached)
dt2.Rows.Add(r)
else dt2.ImportRow(r);
else
if(r.RowState == DataRowState.Detached)
dt1.Rows.Add(r)
else dt1.ImportRow(r);
异常停止,但任何分配给dt2 的尝试仍然表明该行属于另一个表,但如果我注释掉dt2 if 语句并尝试ImportRow(),dt2.Rows.Count保持为 0 且未分配任何记录。
我需要先填充DataRow,然后才能知道它属于哪个表,但我不知道该行在触发此函数之前将包含哪些列。指示它应该转到哪个表的条件不与DataTable中的数据一起存储。
问题是即使它们具有相同的列,NewRow() 正在向行添加一个属性,使其与姊妹表不兼容?有没有一种方法可以获得与NewRow() 相同的功能(在不知道任何列提前的情况下复制模式)但我可以动态分配?我知道我可能可以手动构造一个兼容的行,方法是将其包装在for 循环中并在每次我需要使用DataTable.Columns 属性的新行时构建列,但我想尽可能避免这样做。
【问题讨论】:
-
找出哪个表首先然后从该表创建NewRow...或直接添加数据。
dt1.NewRow()为 dt1 创建一个新行。尝试将其添加到 dt2 将......有问题
标签: c# .net datatable datarow datarowcollection