none
Trabajar sobre una copia de un datarow

    Pregunta


  • Buenas tardes

    estoy trabajando con una aplicación hecha sobre el visual studio 2013 y tengo un comportamiento que me parece extraño. A ver si me podéis resolver la duda sobre si es normal que funcione así o no.

    Resumiendo, tengo una función que recibe como parámetro un datarow. Declaro otro datarow igualándole los valores a la que viene por parámetro, y una vez hecho esto quiero modificar un item de la copia. Sin embargo, al hacerlo también me modifica la original. ¿es normal este comportamiento? ¿a qué es debido? ¿cómo tendría que hacer para modificar la copia pero no el original?

    Pongo un ejemplo, a ver si me explico mejor:


        Sub FuncionPrueba(ByVal RowOriginal As DataRow)
    
            Dim RowTemp As DataRow = Nothing
    
            RowTemp = RowOriginal
    
            'imprimo el valor del item 'CodigoArticulo' en las 2 rows. Imprimen lo mismo. Por ejemplo '0001'
            MsgBox(RowOriginal.Item("CodigoArticulo"))
            MsgBox(RowTemp.Item("CodigoArticulo"))
    
            'cambio el valor del item 'CodigoArticulo' en ROWTEMP
            RowTemp.Item("CodigoArticulo") = "0002"
    
            'vuelvo a imprimir las 2 rows. Imprimen las 2 '0002'. ¿No debería imprimir el primer MsgBox '0001' y el segundo '0002'?
            MsgBox(RowOriginal.Item("CodigoArticulo"))
            MsgBox(RowTemp.Item("CodigoArticulo"))
    
        End Sub

    Un saludo y gracias de antemano por las aclaraciones!


    jueves, 3 de noviembre de 2016 15:15

Respuestas

  • Hola JavierRomero,

    Es normal, ya que al asignar la DataRowOriginal al otro DataRowTemp lo que haces no es crear una copia sino solo lo almacena, pero internamente el DataRowTemp hace referencia al DataTable 'antiguo' por así decirlo.

    Podrías clonar la estructura de el DataTable e importar la fila, algo como :

     Sub FuncionPrueba(ByVal RowOriginal As DataRow)
    
            Dim dt As DataTable = RowOriginal.Table.Clone
            dt.ImportRow(RowOriginal)
    
            Dim RowTemp As DataRow = dt.Rows(0)
    
            MsgBox(RowOriginal.Item("CodigoArticulo"))
            MsgBox(RowTemp.Item("CodigoArticulo"))
    
    
            RowTemp.Item("CodigoArticulo") = "0002"
    
            MsgBox(RowOriginal.Item("CodigoArticulo"))
            MsgBox(RowTemp.Item("CodigoArticulo"))
    
        End Sub

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    jueves, 3 de noviembre de 2016 15:50