Как заполнить DataRow и назначить его одной из двух таблиц на основе условия? - PullRequest
0 голосов
/ 09 января 2019

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

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, но я бы хотел по возможности избегайте этого.

1 Ответ

0 голосов
/ 14 января 2019

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

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

Это эффективно клонировало строки.

...