progress.minmum = 0;
progress.step = 1;
progress.maxmum = dataSet.Tables[0].Rows.Count;
foreach( DataRow dr in dataSet.Tables[0].Rows )
{
progress.PerformStep();
}
progress.step = 1;
progress.maxmum = dataSet.Tables[0].Rows.Count;
foreach( DataRow dr in dataSet.Tables[0].Rows )
{
progress.PerformStep();
}
解决方案 »
- C# 写的windows服务无法触发事件的问题
- 高效得查找两个ArrlyList中的重复值
- 执行Sql时,什么方法可以同时返回受影响的行数和记录集
- 如何在静态的DLL回调函数里面访问主界面?
- C#桌面应用程序中通过 select语句在 access 中得到的数据怎样与 dataGridview 绑定
- 关于类型转换的(字符串转换成控件)!
- 微软的bug(分布式事务),试用了微软提供的解决方案,但还是没有用,碰过这种问题的大虾请过来看看
- Windows TextBox输入验证
- 一个数据绑定的问题,快帮忙啊!!!
- 如何判断一个控件是否可为一个容器控件?
- 十进制数字10怎么简洁地转换为字符串0a,即如何自动在前面补零?
- 如果子窗体用Singleton模式,那么我关掉后怎么再打开
但是这样不能同步啊,我要的是fill的时候就显示,你这样是fill后才行!
dataset后操作数据时候显示进度条。但是如果使用
SqlDataAdapter sda = ...
sda.Fill(ds);
的话,就会一次将数据读入DataSet。即使使用多线程的话,也不能让进度条中
的进度合理显示。所以应该改用:
//先获取全部记录条数,这个即使是大表,速度也应该比较快
SqlCommand sc = new SqlCommand("select count(*) from table1",sqlconn);
int count = (int) sc.ExecuteScalar();
progress1.Step = 1; //设置步进为1
int pernum = count/100; //设置每次分步Fill的记录条数
int start = 0;
DataSet ds = new DataSet();
SqlDataAdapter sda = new SqlDataAdapter(.....);
//以下在另一线程里从数据库读数据到DataSet中
int end = (start+pernum>=count)?count-1 : start+pernum;
sda.Fill(ds,start,end,"mytable");
//操作主线程中的progress1增加一步
if(end>=count)
progress1.SetPos(100);
else
progress1.StepIt();通过分步Fill数据集和多线程的配合就可以做到。不过,如果采用
DataReader和多线程配合更简单些(因为可以在DataReader的read
方法中设置进度),只是使用Fill DataSet便于后期数据操作。