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

王朝other·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

在查询大数据量时,窗体界面会不动,“正在查询...”的提示也不能显示。所以打算用多线程来实现,可是当在线程里面执行到 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;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航