Estou procurando uma maneira simples de fazer um clone de um DataRow. É como tirar um instantâneo daquele Row e salvá-lo. Os valores da linha original podem então ser alterados, mas ainda temos outra cópia salva que não muda. Esta é a maneira correta de fazer isso?
DataRow Source, Destination;
// Assume we create some columns and fill them with values
Destination.ItemArray = Source.ItemArray;
Isso apenas definirá a referência do ItemArray do Snapshot para apontar para aquele em Source ou realmente fará uma cópia separada? Devo fazer isso em vez disso?
Destination.ItemArray = Source.ItemArray.Clone();
EDIT: Eu não acho que o segundo trecho de código realmente compila.
Respostas:
Você pode usar o
ImportRow
método para copiar Row de DataTable para DataTable com o mesmo esquema:Atualizar:
Com sua nova edição, eu acredito:
vai funcionar
fonte
destRow.ItemArray = sourceRow.ItemArray
então, basta adicionar a linha de volta comdestTable.Rows.Add(destRow);
Observação: a resposta helfpul de cuongle tem todos os ingredientes, mas a solução pode ser simplificada (não há necessidade
.ItemArray
) e pode ser reformulada para corresponder melhor à pergunta feita.Para criar um clone (isolado) de uma determinada
System.Data.DataRow
instância , você pode fazer o seguinte:Nota: A clonagem superficial é realizada , que funciona como está com valores de coluna que são instâncias de tipo de valor , mas mais trabalho seria necessário para também criar cópias independentes de valores de coluna contendo instâncias de tipo de referência (e criar tais cópias independentes nem sempre é possível )
fonte
Parece que você não quer manter todo o DataTable como uma cópia, porque você só precisa de algumas linhas, certo? Se você tem uma creteria que pode especificar com um select na tabela, você pode copiar apenas essas linhas para um array de backup extra de DataRow como
A função .Select () tem várias opções e esta, por exemplo, pode ser lida como um SQL
Em seguida, você pode importar as linhas desejadas conforme descrito acima.
... para qualquer n válido que desejar, mas as colunas precisam ser as mesmas em cada tabela.
Algumas coisas que você deve saber sobre ImportRow é que haverá erros durante o tempo de execução ao usar chaves primárias!
Primeiro, queria verificar se já existia uma linha que também falhou devido à falta de uma chave primária, mas a verificação sempre falhou. No final, decidi limpar as linhas existentes completamente e importar as linhas que queria novamente.
A segunda questão ajudou a entender o que acontece. A forma como estou usando a função de importação é para duplicar linhas com uma entrada trocada em uma coluna. Percebi que sempre mudou e ainda era uma referência à linha na matriz. Primeiro, tive que importar o original e, em seguida, alterar a entrada desejada.
A referência também explica os erros de chave primária que apareceram quando tentei importar a linha pela primeira vez, pois ela realmente estava dobrada.
fonte
Mas para ter certeza de que sua nova linha está acessível na nova tabela, você precisa fechá-la:
fonte
DataTable destination = source.Clone()
deveria servir ), mas caso contrário, esta resposta é perfeitamente adequada e até preferível à.ItemArray
abordagem na resposta aceita.