Estoy buscando una forma sencilla de hacer un clon de un DataRow. Es como tomar una instantánea de esa fila y guardarla. Los valores de la Fila original son libres de cambiar, pero todavía tenemos otra copia guardada que no cambia. ¿Es esta la forma correcta de hacerlo?
DataRow Source, Destination;
// Assume we create some columns and fill them with values
Destination.ItemArray = Source.ItemArray;
¿Esto solo establecerá la referencia ItemArray de Snapshot para que apunte a la que está en Fuente o realmente hará una copia separada? ¿Debería hacer esto en su lugar?
Destination.ItemArray = Source.ItemArray.Clone();
EDITAR: No creo que el segundo fragmento de código se compile realmente.
Respuestas:
Puede usar el
ImportRow
método para copiar Row de DataTable a DataTable con el mismo esquema:Actualizar:
Con su nueva edición, creo:
trabajará
fuente
destRow.ItemArray = sourceRow.ItemArray
luego, simplemente agregue la fila nuevamente condestTable.Rows.Add(destRow);
Nota: la respuesta helfpul de Cuongle tiene todos los ingredientes, pero la solución se puede simplificar (no es necesario
.ItemArray
) y se puede reformular para que coincida mejor con la pregunta tal como se hizo.Para crear un clon (aislado) de una
System.Data.DataRow
instancia determinada , puede hacer lo siguiente:Nota: Se realiza una clonación superficial , que funciona tal cual con valores de columna que son instancias de tipo de valor , pero se necesitaría más trabajo para crear también copias independientes de valores de columna que contengan instancias de tipo de referencia (y crear tales copias independientes no siempre es posible ).
fuente
Parece que no desea mantener todo el DataTable como una copia, porque solo necesita algunas filas, ¿verdad? Si tiene una creteria que puede especificar con una selección en la tabla, puede copiar solo esas filas a una matriz de respaldo adicional de DataRow como
La función .Select () tiene varias opciones y esta, por ejemplo, se puede leer como SQL
Luego, puede importar las filas que desee como se describe anteriormente.
... para cualquier n válida que desee, pero las columnas deben ser las mismas en cada tabla.
¡Algunas cosas que debe saber sobre ImportRow es que habrá errores durante el tiempo de ejecución al usar claves primarias!
Primero quería verificar si ya existía una fila que también fallaba debido a que faltaba una clave primaria, pero luego la verificación siempre fallaba. Al final, decidí borrar las filas existentes por completo e importar las filas que quería nuevamente.
El segundo problema ayudó a comprender lo que sucede. La forma en que estoy usando la función de importación es duplicar filas con una entrada intercambiada en una columna. Me di cuenta de que siempre cambiaba y aún era una referencia a la fila de la matriz. Primero tuve que importar el original y luego cambiar la entrada que quería.
La referencia también explica los errores de clave principal que aparecieron cuando intenté importar la fila por primera vez, ya que realmente se duplicó.
fuente
Pero para asegurarse de que se pueda acceder a su nueva fila en la nueva tabla, debe cerrar la tabla:
fuente
DataTable destination = source.Clone()
debería hacerlo), pero de lo contrario, esta respuesta está perfectamente bien e incluso es preferible al.ItemArray
enfoque en la respuesta aceptada.