新窗体显示异步进度条的问题 从execl导入数据到数据库,在主窗体中,用backgroundworker实现了,但想在点确认按钮后,在新窗体中显示进度条,请教了,谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 backgroundworker 有1个属性:WorkerReportProgress设置成true另外两个事件:DoWork:你用这个事件来做从excel导入到数据库中的工作在调用RunWorkerAsync()方法之前,计算你需要导入到 数据库中的excel总行数.然后在 DoWork 事件处理过程中:每处理一定数据你报告一下当前进度 用成员函数 ReportProgress(进度值);这个进度值你可以根据你的总体数据量 具体设定ProgressChanged:事件就会触发private void bkWork_ProgressChanged(object sender, ProgressChangedEventArgs e){ int progress = e.ProgressPercentage; //这个时候就用progress 来设定你 新窗口的进度条} ReportProgress(进度值)后 你Sleep(10)毫秒呢? private void bworkerExecl_DoWork(object sender, DoWorkEventArgs e) { try { e.Result = this.RetrieveData(bworkerExecl, e); } catch (Exception ex) { MessageBox.Show(ex.Message); throw; } } private int RetrieveData(BackgroundWorker worker, DoWorkEventArgs e) { int maxRecords = (int)e.Argument; int percent = 0; for (int i = 0; i < maxRecords; i++) { if (worker.CancellationPending) { return i; } //添加到数据库 Mcontact.groupid = Xgroupid; Mcontact.name = DTexecl.Rows[i][Xname].ToString(); Mcontact.phone = DTexecl.Rows[i][Xphone].ToString(); Mcontact.gender = DTexecl.Rows[i][Xgender].ToString(); Mcontact.profession = ""; Mcontact.position = DTexecl.Rows[i][Xposition].ToString(); Mcontact.zipcode = DTexecl.Rows[i][Xzip].ToString(); Mcontact.address = DTexecl.Rows[i][Xaddress].ToString(); Mcontact.company = DTexecl.Rows[i][Xcompany].ToString(); Bcontact.Add(Mcontact); percent = (int)(((double)i / (double)maxRecords) * execlcount); worker.ReportProgress(percent, new KeyValuePair<int, string>(i, Guid.NewGuid().ToString())); if (i % 1000 == 0 || i == maxRecords-1) { Thread.Sleep(100); } } return maxRecords; }该有的功能都有,应该不是这个地方的问题。我问题中已经说过,我在同窗体中实现了进度条的功能。 或者你 不用backgroundworker 呢?自己写异步调用在异步回调中进行进度条的更新。 不过需要注意 跨线程间控件的调用。 学习C#导出Excel表格出错,请大家给我指点一下,谢谢。 求高手指教 安装windows服务指定为LocalSystem 还要输入账户名和密码 菜鸟求助 C#中 如何使一个没有标题的窗口移动? TXT问本的读取问题,高手请进! 请问数值类型转换 怎样用.NET开发一般的WINDOWS程序?也就是说不用安装.NET就能让用户运行的程序。 MS SQL数据库连接问题 编译时没有问题,浏览时报的错误CS1595: 已在多处定义IntelligentOffice.Desktop._Default C# BackGroundWorker跨线程 分享:C# 连连看源代码(丰富音乐及图片)转自51CTO
有1个属性:WorkerReportProgress设置成true
另外两个事件:
DoWork:你用这个事件来做从excel导入到数据库中的工作
在调用RunWorkerAsync()方法之前,计算你需要导入到 数据库中的excel总行数.
然后在 DoWork 事件处理过程中:
每处理一定数据你报告一下当前进度 用成员函数 ReportProgress(进度值);这个进度值你可以根据你的总体数据量 具体设定
ProgressChanged:事件就会触发
private void bkWork_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
int progress = e.ProgressPercentage;
//这个时候就用progress 来设定你 新窗口的进度条
}
{
try
{
e.Result = this.RetrieveData(bworkerExecl, e);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
throw;
}
} private int RetrieveData(BackgroundWorker worker, DoWorkEventArgs e)
{
int maxRecords = (int)e.Argument;
int percent = 0;
for (int i = 0; i < maxRecords; i++)
{
if (worker.CancellationPending)
{
return i;
} //添加到数据库
Mcontact.groupid = Xgroupid;
Mcontact.name = DTexecl.Rows[i][Xname].ToString();
Mcontact.phone = DTexecl.Rows[i][Xphone].ToString();
Mcontact.gender = DTexecl.Rows[i][Xgender].ToString();
Mcontact.profession = "";
Mcontact.position = DTexecl.Rows[i][Xposition].ToString();
Mcontact.zipcode = DTexecl.Rows[i][Xzip].ToString();
Mcontact.address = DTexecl.Rows[i][Xaddress].ToString();
Mcontact.company = DTexecl.Rows[i][Xcompany].ToString();
Bcontact.Add(Mcontact); percent = (int)(((double)i / (double)maxRecords) * execlcount);
worker.ReportProgress(percent, new KeyValuePair<int, string>(i, Guid.NewGuid().ToString()));
if (i % 1000 == 0 || i == maxRecords-1)
{
Thread.Sleep(100);
}
} return maxRecords;
}
该有的功能都有,应该不是这个地方的问题。我问题中已经说过,我在同窗体中实现了进度条的功能。