如何根据条件填充DataRow并将其分配给两个表之一?

时间:2019-01-09 17:38:11

标签: c# .net datatable datarow datarowcollection

我有一个应用程序正在处理数据,该应用程序需要根据是否翻转位对数据进行排序。表相同。现在的代码看起来像这样:

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属性的新行时构建列,但是我尽量避免这样做。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。由于无法将从一个表建立的行直接添加到另一表中,因此我认为这是有问题的DataRow对象,但是ItemArray属性可能是我所需要的。

                    if (isErrorRow)
                    {                           
                        //nr is the NewRow for dt1
                        var nr2 = dt2.NewRow();
                        nr2.ItemArray = nr.ItemArray;
                        dt2.Rows.Add(nr2);
                    }

这有效地克隆了行。