1

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

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属性的新行时构建列,但如果可能的话,我想避免这样做。

4

1 回答 1

0

我找到了我的解决方案。由于我不能直接将由一个表构建的行添加到另一个表,我认为这是DataRow有问题的对象,但该 ItemArray属性可能就是我所需要的。

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

这有效地克隆了行。

于 2019-01-14T14:00:01.907 回答