关于C#函数ApplicationDoEvents()

来源:百度知道 编辑:UC知道 时间:2024/06/20 08:42:09
我做了一个Grid,要把Grid中的数据全部导出到EXCEL中,但是因为数据比较多,所以导出要花上几秒种,导出的时候窗口如同死机一样,一直要到导出结束才可以流畅的动弹。我如何才能在导出的时候也可以在界面上点击其他东西呢?

听说使用ApplicationDoEvents()就可以,但是怎么写呢?

比如我的代码

// 导出EXCEL
private void btnExcel_Click(object sender, EventArgs e)
{
pivotGridControl1.ExportToXls("拒绝原因分析(总).xls");
}

那句话加在前面,后面还是卡,怎么做比较好呢???

你提的问题实际上是优化导出excel效率的问题,有两种解决方法:
1 优化你的pivotGridControl1.ExportToXls方法,使之速度变快,具体可以用微软提供的EXCEL组件,将数据源存到内存的datatable中,然后用StreamWriter的方式,将数据Response出来,存到excel中, 例如:
Response.AddHeader("content-disposition", "attachment; filename=aaa.xls");
Response.ContentType = "application/ms-excel";
Response.WriteFile(strPath);

2 可以new一个线程,即thred类,将导出EXCEL这个动作放到线程中去做,这样主界面就不会死掉了。例如:
Thread thred = new Thread(new ThreadStart(SetProcess));
thred.Start(pivotGridControl1.ExportToXls);

当然,如果pivotGridControl1控件是被主线程调用的,还需跨线程调用pivotGridControl1,用begininvoke方法实现。

3 DoEvents在效率有上的问题,处理同样的一个事件调用了DoEvents后效率降低了好几倍,这也是为什么要慎用的原因。如:
private void button1_Click(object sender, EventArgs e)
{
expendTime.start();
for (int q = 0; q < 100000; q++)
{
textBox1.Text = q.ToString();
Application.DoEvents();