我有一个应用程序正在处理数据,该应用程序需要根据是否翻转位对数据进行排序。表相同。现在的代码看起来像这样:
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
语句并尝试{{ 1}},ImportRow()
保持为0,并且未分配任何记录。
在知道它属于哪个表之前,我需要填充dt2.Rows.Count
,但是我不知道该行在到达此功能之前将具有哪些列。表示应转到哪个表的条件是 not 而不与数据一起存储在DataRow
中。
问题是DataTable
即使它们具有相同的列,也正在向该行添加一个属性以使其与姐妹表不兼容?有没有一种方法可以使我获得与NewRow()
相同的功能(复制架构而无需提前知道任何列),但是可以动态分配?我知道我可以手动构造与之兼容的行,方法是将其包装在NewRow()
循环中,并在每次需要使用for
属性的新行时构建列,但是我尽量避免这样做。
答案 0 :(得分:0)
我找到了解决方案。由于无法将从一个表建立的行直接添加到另一表中,因此我认为这是有问题的DataRow
对象,但是ItemArray
属性可能是我所需要的。
if (isErrorRow)
{
//nr is the NewRow for dt1
var nr2 = dt2.NewRow();
nr2.ItemArray = nr.ItemArray;
dt2.Rows.Add(nr2);
}
这有效地克隆了行。