Я ищу простой способ сделать клон DataRow. Это как сделать снимок этой строки и сохранить его. Значения исходной строки могут быть изменены, но у нас все еще есть другая сохраненная копия, которая не изменяется. Это правильный способ сделать это?
DataRow Source, Destination;
// Assume we create some columns and fill them with values
Destination.ItemArray = Source.ItemArray;
Будет ли это просто устанавливать ссылку на ItemArray моментального снимка так, чтобы она указывала на ссылку в Source, или она действительно создает отдельную копию? Должен ли я сделать это вместо этого?
Destination.ItemArray = Source.ItemArray.Clone();
EDIT: я не думаю, что второй фрагмент кода действительно компилируется.
Ответы:
Вы можете использовать
ImportRow
метод для копирования строки из DataTable в DataTable с той же схемой:Обновить:
С вашим новым Edit, я считаю:
буду работать
источник
destRow.ItemArray = sourceRow.ItemArray
затем просто добавить строку обратно с помощьюdestTable.Rows.Add(destRow);
Примечание. В ответе cuongle helfpul есть все ингредиенты, но решение можно упростить (в этом нет необходимости
.ItemArray
) и изменить структуру, чтобы лучше соответствовать заданному вопросу.Чтобы создать (изолированный) клон данного
System.Data.DataRow
экземпляра , вы можете сделать следующее:Примечание. Выполняется поверхностное клонирование , которое работает как есть со значениями столбцов, которые являются экземплярами типов значений , но потребуется дополнительная работа, чтобы также создать независимые копии значений столбцов, содержащих экземпляры ссылочного типа (а создание таких независимых копий не всегда возможно. ).
источник
Похоже, вы не хотите хранить весь DataTable как копию, потому что вам нужны только некоторые строки, верно? Если у вас есть критерия, которую вы можете указать с помощью выбора в таблице, вы можете скопировать только эти строки в дополнительный резервный массив DataRow, например
Функция .Select () имеет несколько опций, и этот, например, можно читать как SQL
Затем вы можете импортировать нужные строки, как описано выше.
... для любого допустимого n, которое вам нравится, но столбцы должны быть одинаковыми в каждой таблице.
Что вам следует знать о ImportRow, так это то, что при использовании первичных ключей во время выполнения будут возникать ошибки!
Сначала я хотел проверить, существует ли уже строка, что также не удалось из-за отсутствия первичного ключа, но тогда проверка всегда терпела неудачу. В конце концов я решил полностью очистить существующие строки и снова импортировать нужные строки.
Вторая проблема действительно помогла понять, что происходит. Я использую функцию импорта для дублирования строк с измененной записью в одном столбце. Я понял, что он всегда менялся и все еще оставался ссылкой на строку в массиве. Сначала мне пришлось импортировать оригинал, а затем изменить запись, которую я хотел.
В справке также объясняются ошибки первичного ключа, которые возникли, когда я впервые попытался импортировать строку, поскольку она действительно была увеличена вдвое.
источник
Но чтобы убедиться, что ваша новая строка доступна в новой таблице, вам нужно закрыть таблицу:
источник
DataTable destination = source.Clone()
должен), но в остальном этот ответ совершенно прекрасен и даже предпочтительнее.ItemArray
подхода в принятом ответе.