Как заполнить DataRow и назначить его одной из двух таблиц на основе условия?

У меня есть данные, обрабатываемые приложением, которое должно сортировать данные в зависимости от того, перевернут ли бит. Таблицы идентичны. Код в его нынешнем виде выглядит примерно так:

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 все еще заявляет, что строка принадлежит другой таблице, но если я закомментирую dt2if заявление и просто попытка ImportRow(), dt2.Rows.Count остается на 0 и записи не назначены.

Мне нужно заселить DataRow до того, как узнать, к какой таблице он принадлежит, но я понятия не имею, в какие столбцы будет помещена строка, прежде чем она попадет в эту функцию. Условие, которое указывает, к какой таблице следует обратиться, не сохраняется с данными в DataTable,

Проблема в том, что хотя они имеют одинаковые столбцы, NewRow() добавляет атрибут в строку, что делает его несовместимым с сестринской таблицей? Есть ли способ получить ту же функциональность, что и NewRow() (скопируйте схему, не зная, какие столбцы опережают время), но что я могу динамически назначить? Я знаю, что мог бы, вероятно, вручную создать строку, совместимую с любой, обернув ее в for цикл и построение столбцов каждый раз, когда мне нужна новая строка, используя DataTable.Columns собственности, но я хотел бы избежать этого, если это возможно.

1 ответ

Решение

Я нашел свое решение. Поскольку я не могу добавить строку, составленную из одной таблицы, непосредственно в другую, я решил, что это DataRow объект, который был проблематичным, но ItemArray собственность была, вероятно, всем, что мне было нужно.

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

Это эффективно клонировало ряды.

Другие вопросы по тегам