У меня есть данные, которые обрабатываются приложением, которое должно сортировать данные в зависимости от того, был ли бит переключен. Таблицы идентичны . Код в таком виде выглядит примерно так:
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
, но я бы хотел по возможности избегайте этого.