c# - 用线程 c# 填充 datagridview

标签 c# multithreading datagridview

我试图从 sql 查询填充 datagridview 但它需要很长时间,我试图做的是显示 .gif“加载”同时填充网格,我使用线程但 .gif 卡住,并且如果我使用 CheckForIllegalCrossThreadCalls = false;,则 datagridview 不会加载滚动条,这很奇怪。这是我的代码

delegate void CambiarProgresoDelegado(); 

点击按钮

 private void btn_busca_Click(object sender, EventArgs e)
    {
        pictureBox1.Visible = true;
       thread=  new Thread(new ThreadStart(ejecuta_sql));
        thread.Start();
    }

方法

private void ejecuta_sql()
    {

if (this.InvokeRequired)
        {         

         CambiarProgresoDelegado delegado = new CambiarProgresoDelegado(ejecuta_sql);

        object[] parametros = new object[] { };
          this.Invoke(delegado, parametros);
       }
        else
        {
            myConnection.Open();
            SqlCommand sql_command2;
            DataSet dt2 = new DataSet();

            sql_command2 = new SqlCommand("zzhoy", myConnection);
            sql_command2.CommandType = CommandType.StoredProcedure;
            sql_command2.Parameters.AddWithValue("@FechaIni", dateTimePicker1.Value.ToShortDateString());
            sql_command2.Parameters.AddWithValue("@FechaFin", dateTimePicker2.Value.ToShortDateString());
            SqlDataAdapter da2 = new SqlDataAdapter(sql_command2);
            da2.Fill(dt2, "tbl1");
            grid_detalle.DataSource = dt2.Tables[0];
            myConnection.Close();
            pictureBox1.Visible = false;


        }

并且 .gif 卡住,直到线程完成他的工作。

最佳答案

您创建了一个线程,但随后立即使用 Invoke() 将代码切换回主 UI 线程,从而否定了创建线程的任何好处。

在另一个线程上运行查询,然后 Invoke() 只是更新 UI 的部分:

    private string FechaIni;
    private string FechaFin;

    private void btn_busca_Click(object sender, EventArgs e)
    {
        btn_busca.Enabled = false;
        pictureBox1.Visible = true;
        FechaIni = dateTimePicker1.Value.ToShortDateString();
        FechaFin = dateTimePicker2.Value.ToShortDateString();
        thread = new Thread(new ThreadStart(ejecuta_sql));
        thread.Start();
    }

    private void ejecuta_sql()
    {
        myConnection.Open();
        SqlCommand sql_command2;
        DataSet dt2 = new DataSet();

        sql_command2 = new SqlCommand("zzhoy", myConnection);
        sql_command2.CommandType = CommandType.StoredProcedure;
        sql_command2.Parameters.AddWithValue("@FechaIni", FechaIni);
        sql_command2.Parameters.AddWithValue("@FechaFin", FechaFin);
        SqlDataAdapter da2 = new SqlDataAdapter(sql_command2);
        da2.Fill(dt2, "tbl1");
        myConnection.Close();

        this.Invoke((MethodInvoker)delegate { 
            grid_detalle.DataSource = dt2.Tables[0];
            pictureBox1.Visible = false;
            btn_busca.Enabled = true;
        });
    }

关于c# - 用线程 c# 填充 datagridview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27821341/

相关文章:

c# - 单击时部分选择 DataGridView 单元格的文本

c# - 将 dataGridView 行导出到 Excel 或 SQL Server 数据库的最快方法是什么

winforms - Winform Framework 2.0中ListView和DataGridView的滚动条始终可见

C#、Xamarin.Essentials 安全存储

c++ - UDP/TCP 服务器中监听器线程与工作线程的比率?

c# - 获取 ASP.NET MVC5 WebAPI token 有时会失败

c# - 在多线程应用程序中使用 Thread.Sleep 的原因是什么?

java - 使用 10 个并行线程查找数组中的最大值

c# - 什么是好的Telnet 客户端实现C#?

c# - Word自动化打印输出: wait for its finished?