none
Problema al convertir JSON a DataTable RRS feed

  • Pregunta

  • Hola a todos, tengo el siguiente código para convertir JSON a DataTable:

    DataTable Datos = JsonConvert.DeserializeObject<DataTable>(Json)

    Como podrán apreciar es bastante simple y funciona, pero hay un detalle en el que me quede trancado y agradecería su ayuda.

    Escenario 1 (Funciona). una vez que tengo el DataTable lo asigno como DataSource de un GridView (AutoGenerateColumns="True"), y las columnas se auto-generan tranquilamente y todo funciona normal, esto si me funciona, pero el siguiente escenario es donde tengo el problema

    Escenario 2 (NO funciona). establezco AutoGenerateColumns="False" y asigno manualmente los DataField de cada Columna y también asigno valores a los DataKeyNames, y al momento de asignar el DataTable al DataSource del GridView me sale el siguiente mensaje:

    'DataBinding: 'System.Data.DataRowView' no contiene una propiedad con el nombre 'VehiculoSecuencial'.'

    Es como si la data se convirtiera al DataTable pero sin cabeceras que permitan cruzar los datafield contra el DataTable, para terminar mi prueba he creado una clase CXXX y convertí el JSON a un List<CXXX> y esta lista es la que le mande al GridView y los DataField se asignan tranquilamente.

    Pero buena la idea no es crear una clase por cada GridView y/o JSON, al contrario la idea es que sea dinámico.


    Roy Sillerico


    jueves, 21 de septiembre de 2017 23:37

Respuestas

  • hola

    >>'DataBinding: 'System.Data.DataRowView' no contiene una propiedad con el nombre 'VehiculoSecuencial'.'

    pero cuando realizaste el Escenario 1 pudiste ver una columna con el nombre VehiculoSecuencial ?

    si usas el analizer del datatable, ves esa columna? pone un breakpoint y al pasar el mouse sobre la variable del datatable usa la opcion

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 22 de septiembre de 2017 14:21
  • El DataKeyName lo necesito
    No deberia haber problema. Si pones el DataKeyNames correcto usando el nombre o nombres exactos de las columnas del DataSet (que internamente se generan a partir de los nombres de propiedades que contengan las filas del JSON), deberia funcionar sin ningun problema. Haz una ruptura con el debugger en la siguiente linea despues de haber deserializado el DataSet, y examina los nombres de columnas que se han generado, a ver si son los que esperabas.
    viernes, 22 de septiembre de 2017 15:17

Todas las respuestas

  • Cuando conectas el GridView, hay que cuidar las propiedades que se asignan como nombres de columnas, porque se toman de los nombres de columnas del DataSte, en lugar de usar propiedades de clase. El DataTable genera los nombres de columna a partir del JSON, mientras que el List<XXX> los tiene fijos en las propiedades de la clase. Por eso puede ser que el List te funcione y el DataTable no (distintos nombres autogenerados en el DataSet). No tiene nada que ver con el hecho de que el DataTable se haya construido previamente a partir de un JSON, también te podria pasar lo mismo si el DataTable lo hubieses cargado (por ejemplo) desde una base de datos con un DataAdapter y los nombres de columna no concordasen.


    viernes, 22 de septiembre de 2017 8:17
  • Alberto como siempre un gusto.

    Primero quisiera hacerte una pregunta, entonces ¿como puedo hacer para poder llevar un json a un gridview (sin crear clases y deserealizar a algún List<T>) y poder manejar los datakeynames y los datafield?

    Bueno voy entendiendo tu explicación, pero aun hay cuestionantes que quisiera aclarar, para aclararte mejor el panorama te explico, antes yo trabajaba con XML y tenia el siguiente método GENÉRICO:

            protected void CargarXMLGridView(ref GridView oGridView, string XML)
            {
                XmlDocument xml = new XmlDocument();
                xml.LoadXml(XML);
                XmlNodeReader xmlReader = new XmlNodeReader(xml);
    
                using (DataSet ds = new DataSet())
                {
                    ds.ReadXml(xmlReader);
                    oGridView.DataSource = ds;
                    oGridView.DataBind();
                }
            }
    Y bueno me funcionaba a la perfección todo eso del datakeyname y de los datafield y no necesitaba crear clases, ahora simplemente quiero replicar lo mismo pero utilizando JSON, como logro hacer eso???


    Roy Sillerico

    viernes, 22 de septiembre de 2017 13:02
  • hola

    >>'DataBinding: 'System.Data.DataRowView' no contiene una propiedad con el nombre 'VehiculoSecuencial'.'

    pero cuando realizaste el Escenario 1 pudiste ver una columna con el nombre VehiculoSecuencial ?

    si usas el analizer del datatable, ves esa columna? pone un breakpoint y al pasar el mouse sobre la variable del datatable usa la opcion

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 22 de septiembre de 2017 14:21
  •  simplemente quiero replicar lo mismo pero utilizando JSON, como logro hacer eso???

    Exatamente igual que lo hacias con el XML. No asignes DataKeyNames ni nada, simplemente deserializa y asigna el DataSource:

    DataTable ds = JsonConvert.DeserializeObject<DataTable>(Json)
    oGridView.DataSource = ds;
    oGridView.DataBind();
    

    viernes, 22 de septiembre de 2017 14:49
  • El DataKeyName lo necesito para tener valores de cada fila ocultos (como sus PK de cada registro).

    Roy Sillerico

    viernes, 22 de septiembre de 2017 14:51
  • El DataKeyName lo necesito
    No deberia haber problema. Si pones el DataKeyNames correcto usando el nombre o nombres exactos de las columnas del DataSet (que internamente se generan a partir de los nombres de propiedades que contengan las filas del JSON), deberia funcionar sin ningun problema. Haz una ruptura con el debugger en la siguiente linea despues de haber deserializado el DataSet, y examina los nombres de columnas que se han generado, a ver si son los que esperabas.
    viernes, 22 de septiembre de 2017 15:17
  • La verdad voy a hechar un buuuuuu para mi :D, resulta que en VehiculoSecuencial habia un espacio al final que hacia que no funcione "VehiculoSecuencial ", bueno de todas maneras muchas gracias a todos.

    Roy Sillerico

    sábado, 23 de septiembre de 2017 18:54