多线程操作ProgressBar的问题

java__net 2011-06-02 06:56:04
我没做过CS的项目,很少操作多线程,问题如果问的不是很清楚,请见谅。

需求是这样,当开启一个线程(读取数据),获得数据总数设置进度条的最大值,然后每读取一条数据,就让进度条+1

但是会报错

线程间操作无效: 从不是创建控件“progressBar1”的线程访问它

后来查了很多资料,写的例子都是单独操作进度

或者是 Control.CheckForIllegalCrossThreadCalls = false;

再有就是通过Invoke方法之类的,但没有设置最大值和最小值的地方,

有没有朋友能写一个详细的例子提供参考一下,谢谢!
...全文
141 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
garfieldzf 2011-06-02
  • 打赏
  • 举报
回复
这是我前几天写的一个导入程序, 在线程里面操作proagressBar控件,
当你开启线程前你可以先查出来你要读取的数据总数。 然后在线程方法中读取数据时,进度条同时更新。
进度条此时不用设置最大值。
注: 注意两个变量。

private void ImportXls()
{

CheckForIllegalCrossThreadCalls = false;
btnOK.Enabled = false;
this.Cursor = Cursors.WaitCursor;

var iUserCount = 0;
int i = 0;

DataSet ds = new DataSet();
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strXlsPath + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"";
using (OleDbConnection conn = new OleDbConnection(strConn))
{
OleDbDataAdapter da = new OleDbDataAdapter("select * from [sheet1$A:CV]", conn);
da.Fill(ds, "sheet1");
}

int RecCount = ds.Tables[0].Rows.Count;
progressBar1.Value = 0;
lblCount.Text = "0/" + RecCount.ToString();
progressBar1.Maximum = RecCount;

foreach (DataRow dr in ds.Tables[0].Rows)
{
String barCode = String.Empty;
String userChName = String.Empty;
String userENName = String.Empty;
String userCompany = String.Empty;
String userTableNo = String.Empty;

i++;
lblInfo.Text = "正在导入第:" + i.ToString() + "条数据";
lblCount.Text = i.ToString() + "/" + RecCount.ToString();

progressBar1.Value = i;

barCode = dr["邀请号"].ToString().Trim();
userChName = dr["中文姓名"].ToString().Trim();
userENName = dr["英文姓名"].ToString().Trim();
userCompany = dr["公司/机构名"].ToString().Trim();
userTableNo = dr["桌号"].ToString().Trim();

String sql = "insert into T_UserInfo(UserBarCode,UserCHName,UserENName,UserCompany,UserTableNO) values (@UserBarCode,@UserCHName,@UserENName,@UserCompany,@UserTableNO)";
SqlParameter[] para =
{
new SqlParameter("@UserBarCode",SqlDbType.NVarChar),
new SqlParameter("@UserCHName",SqlDbType.NVarChar),
new SqlParameter("@UserENName",SqlDbType.NVarChar),
new SqlParameter("@UserCompany",SqlDbType.NVarChar),
new SqlParameter("@UserTableNO",SqlDbType.NVarChar)
};
para[0].Value = barCode;
para[1].Value = userChName;
para[2].Value = userENName;
para[3].Value = userCompany;
para[4].Value = userTableNo;

iUserCount++;
try
{
DbHelperSQL.ExecuteSql(sql, para);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message+barCode);

}
}
lblInfo.Text = "完成";
lblCount.Text = "0/0";
progressBar1.Value = 0;
this.Cursor = Cursors.Default;
btnOK.Enabled = true;
MessageBox.Show("导入结束,共导入数据:" + iUserCount.ToString() + "条");
this.DialogResult = DialogResult.OK;

}

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧