在多线程里查询数据库并填充dataGrid

来源:互联网 发布:网络推广代运营合同 编辑:程序博客网 时间:2024/06/06 00:15
在查询大数据量时,窗体界面会不动,“正在查询...”的提示也不能显示。所以打算用多线程来实现,可是当在线程里面执行到 this.dataGridDF.DataSource=dt.DefaultView;填充数据时却提示报错,说什么该线程不能调用主线程创建的控件等等。后来查了许多资料,终于搞定。可以在查询数据库时操作别的了,“正在查询...”的提示也显示了。
 
//或者在前面用一个线程查询,在线程里调用dataGrid.BeginInvoke(异步方法)来单独填充
 
  public delegate void myDelegate();  DataTable dt;
 
  private void btnDianJia_Click(object sender, System.EventArgs e)  {   try   {    mythread = new Thread(new ThreadStart(ThreadWork));    mythread.Start();       }   catch(System.Exception ex)   {    MessageBox.Show(this,ex.Message,"提示",MessageBoxButtons.OK,MessageBoxIcon.Information);   }     }   void ThreadWork()  {   this.dataGridDJ.CaptionText="正在查询电价数据...";   mf.statusBarPanel1.Text="正在查询电价数据...";   this.Cursor=Cursors.WaitCursor;
 
   string shijian=this.dateTimeDianJia.DateValue;   DateTime today=DateTime.Today;   string mingcheng=this.txtMingCheng.Text;   string leibie=this.cmbBoxLiebie_DJ.SelectedValue.ToString();   PowerWeb.BLL.DianFeiDianJia.DianJia dj=new PowerWeb.BLL.DianFeiDianJia.DianJia();
 
   if(shijian==today.ToString("yyyyMM"))   {    dt=dj.GetList(leibie,mingcheng).Tables[0];   }   else   {    dt=dj.GetListOld(leibie,mingcheng,shijian).Tables[0];   }   this.dataGridDJ.CaptionText=shijian+"电价信息 (共计条"+dt.Rows.Count.ToString()+"记录)";
 
   dataGridDJ.BeginInvoke(new myDelegate(FillData));//异步调用(来填充)      this.Cursor=Cursors.Default;   mf.statusBarPanel1.Text="查询结束";  }    private void FillData()  {
原创粉丝点击