none
Ayuda System.InvalidCastException: 'No se puede convertir un objeto de tipo 'System.Windows.Forms.BindingSource' al tipo 'System.Data.DataTable'.' RRS feed

  • Pregunta

  •  

    Hola necesito ayuda para pasar registros de un datagridview sin enlazar llamado GridCarro a otro que esta enlazado a una base de datosa en access llamado cajaDataGridView. Los dos DataGridView estan en el mismo form y los estoy haciendo en lenguaje C#

    DataTable dt = (DataTable)this.cajaDataGridView.DataSource;

                DataRow rowNew = dt.NewRow();
                string B = this.GridCarro.CurrentRow.Cells[0].Value.ToString();

                //'asignas los campos
                foreach (DataGridViewRow row in stockDataGridView.SelectedRows)
                {
                    dt.Rows.Add(B);

                cajaDataGridView.DataSource = dt;
                }

    Ese es el codigo que tengo el cual me tira el siguiente error: System.InvalidCastException: 'No se puede convertir un objeto de tipo 'System.Windows.Forms.BindingSource' al tipo 'System.Data.DataTable'.'

    jueves, 23 de enero de 2020 23:36

Respuestas

  • Hola Joaco

    Me parece que ya te había pasado Leandro la respuesta; ¿No te funcionó? 

    Yo lo que haría es 1) No trabajar con el DataGridView enlazado a datos, si no 2) No usar el BindingSource (¿De qué sirve en tu caso? Me parece que el BindingSource es sólo un paso intermedio entre el DataGridView y el DataSource, que en este caso creo que no sirve), si no 3) Tratar de acceder a la tabla que está en el DataSource, así

    dt = cajaDataGridView.DataSource.Tables[0];

    Pero no se si te vas a volver a "tropezar" con el BindingSource. Me parece que estaría mejor que no lo uses (excepto que lo necesites de verdad, como en el caso de que usaras un BindingNavigator, por ejemplo).

    O sea sería, directamente, asignar al DataSource del DataGridView el DataTable que obtenes de la consulta a la base de datos, en lugar de asignar el DataTable al BindingSource y luego éste al DataSource del DataGridView. Si hicieras así sería muy difícil que falle.

    Después de eso, hay 2 cosas que me llaman la atención:

    foreach (DataGridViewRow row in stockDataGridView.SelectedRows)
                {
                    dt.Rows.Add(B);

                cajaDataGridView.DataSource = dt;
                }

    1) La 2da linea del cuerpo del foreach debería ir afuera, después del mismo. Así lo asignas una sola vez y con ya todas las filas agregadas, y no una vez por cada fila que vas agregando.

    2) No entiendo por qué 

    dt.Rows.Add(B);

    y no

    dt.Rows.Add(row);

    Porque B es un string, y hay que pasarle un DataGridViewRow ... (quizás está bien eso por algo que no se)

    Saludos

    Pablo


    viernes, 24 de enero de 2020 0:20
  • hola

    Te di la respuesta en la otra pregunta

    Pasar datos de un datagrid a otro ubicado en otro form

    tienes que castear a BindingSource porque estas usando un componente intermedio, el cual no se porque lo utilizas, para recien en el siguiente paso obtener el datatable

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 24 de enero de 2020 12:05
  • hola

    El tema es como estas generando el datagrid enlazado, si lo harias con codigo sin usar el BindingSource seria mas simple porque tendrias el objeto de dato directo para actualizarlo

    DataTable dt = new DataTable();   
    using (var conn = new OleDbConnection("connection string"))   
    {   
        string query = "select campo1, campo2 from <tabla>";   
     
        var cmd = new OleDbCommand(query, conn);   
         
        var da = new OleDbDataAdapter(cmd);     
        da.Fill(dt);   
    } 
     
    DataGridView1.Datasource = dt; 

    asi asignarias directo el datatable que despues puedes recuperar y adicionar rows

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 24 de enero de 2020 17:12

Todas las respuestas

  • Hola Joaco

    Me parece que ya te había pasado Leandro la respuesta; ¿No te funcionó? 

    Yo lo que haría es 1) No trabajar con el DataGridView enlazado a datos, si no 2) No usar el BindingSource (¿De qué sirve en tu caso? Me parece que el BindingSource es sólo un paso intermedio entre el DataGridView y el DataSource, que en este caso creo que no sirve), si no 3) Tratar de acceder a la tabla que está en el DataSource, así

    dt = cajaDataGridView.DataSource.Tables[0];

    Pero no se si te vas a volver a "tropezar" con el BindingSource. Me parece que estaría mejor que no lo uses (excepto que lo necesites de verdad, como en el caso de que usaras un BindingNavigator, por ejemplo).

    O sea sería, directamente, asignar al DataSource del DataGridView el DataTable que obtenes de la consulta a la base de datos, en lugar de asignar el DataTable al BindingSource y luego éste al DataSource del DataGridView. Si hicieras así sería muy difícil que falle.

    Después de eso, hay 2 cosas que me llaman la atención:

    foreach (DataGridViewRow row in stockDataGridView.SelectedRows)
                {
                    dt.Rows.Add(B);

                cajaDataGridView.DataSource = dt;
                }

    1) La 2da linea del cuerpo del foreach debería ir afuera, después del mismo. Así lo asignas una sola vez y con ya todas las filas agregadas, y no una vez por cada fila que vas agregando.

    2) No entiendo por qué 

    dt.Rows.Add(B);

    y no

    dt.Rows.Add(row);

    Porque B es un string, y hay que pasarle un DataGridViewRow ... (quizás está bien eso por algo que no se)

    Saludos

    Pablo


    viernes, 24 de enero de 2020 0:20
  • hola

    Te di la respuesta en la otra pregunta

    Pasar datos de un datagrid a otro ubicado en otro form

    tienes que castear a BindingSource porque estas usando un componente intermedio, el cual no se porque lo utilizas, para recien en el siguiente paso obtener el datatable

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 24 de enero de 2020 12:05
  • Hola muchas gracias por las respuestas la verdad que estoy bastante perdido con este tema y sigo sin poder solucionarlo. No entiendo mucho como armar el codigo para pasar datos de un datagrid sin enlazar a otro enlazado a una base de datos en access ya que si no lo enlazo no encuentro otra manera de hacerlo para que se me grabe en la tabla de la base de datos llamada caja
    viernes, 24 de enero de 2020 15:37
  • hola

    El tema es como estas generando el datagrid enlazado, si lo harias con codigo sin usar el BindingSource seria mas simple porque tendrias el objeto de dato directo para actualizarlo

    DataTable dt = new DataTable();   
    using (var conn = new OleDbConnection("connection string"))   
    {   
        string query = "select campo1, campo2 from <tabla>";   
     
        var cmd = new OleDbCommand(query, conn);   
         
        var da = new OleDbDataAdapter(cmd);     
        da.Fill(dt);   
    } 
     
    DataGridView1.Datasource = dt; 

    asi asignarias directo el datatable que despues puedes recuperar y adicionar rows

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 24 de enero de 2020 17:12