| 加入收藏| 设为首页| 联系我们
在多线程里查询数据库并填充dataGrid_C#教程_www.it958.cn
http://www.domcn.org 文章来源:本站收藏 点击数:
在查询大数据量时,窗体界面会不动,“正在查询...”的提示也不能显示。所以打算用多线程来实现,可是当在线程里面执行到 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() { this.dataGridDJ.DataSource=dt.DefaultView; }