none
Hilos en un datagridview RRS feed

  • Pregunta

  • La pregunta es complicada y voy a tratar de realizarla lo mas simple que pueda

    presiono un boton y se carga con un insert una base de datos sqlite y me muestra los datos en un datagridview

    el problema es que me bloquea la aplicacion mientras lee los datos en squlite y los carga en el datagridview

    Yo lo que hice fue poner un hilo de esta manera

    Thread CargaBase = new Thread(new ThreadStart(Mensajesquellenanlabase));
    CargaBase.Start();

    pero me muestra este error

    o sea carga el datagridview, pero me muestra este error en cada dato que carga

    el codigo para llenar mi datagridview es el siguiente

    SetConnection(); // es la conexion
    sql_con.Open(); // abre la base de datos
    sql_cmd = sql_con.CreateCommand();  // creo el comando
    string CommandText = "select telefono from puerto";
    DB = new SQLiteDataAdapter(CommandText, sql_con);
    DS.Reset();
    DB.Fill(DS);
    DT = DS.Tables[0];
                  
    dataGridView1.DataSource = DT;
                            
    sql_con.Close();

    si me pueden ayudar, ya que si no pongo hilos la aplicacion funciona, pero se traba mientras realiza el proceso y si le pongo un hilo al llenado de la base de datos me sale ese error en el datagridview. Espero haber sido lo mas claro posible dentro de lo dificil que es explicar esta situacion, gracias


    viernes, 14 de junio de 2019 2:43

Todas las respuestas

  • Lo sorprendente es que te salga ese error y no otro. Normalmente lo que deberia ocurrir es que en el momento de ejecutar esta instruccion:

    dataGridView1.DataSource = DT;

    se produzca un error de llamada ilegal entre hilos, porque no es licito modificar el contenido de la pantalla desde un hilo distinto del que la creo.

    Para poder realizar la operacion, es necesario trasladar la ejecucion al hilo principal despues de obtener los datos y antes de presentarlos. Esto se consigue llamando al metodo Invoke de cualquier control, incluido el propio formulario. Se puede hacer de muchas maneras, por ejemplo asi:

    this.Invoke(new MethodInvoker(() => dataGridView1.DataSource = DT));

    viernes, 14 de junio de 2019 9:17
    Moderador