Как заполнить 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
все еще заявляет, что строка принадлежит другой таблице, но если я закомментирую dt2
if
заявление и просто попытка 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);
}
Это эффективно клонировало ряды.