2012-09-16 62 views
6

我有一个大的text file包含大量的数据行。在我的应用程序中,我打开这个文件,通过匹配正则表达式读取每一行,并将其显示在Datagridview中。产生的行总数大约在2000年左右(有时甚至更多,如此巨大的)。进度条和文件加载

因此,对于所有这些操作,需要相当长的时间。所以我使用后台工作者将这段代码移入另一个线程,一切都很好,只是我想在进度条中显示加载状态,我失败了。

我已经使用FileInfo类来获取文件长度,然后将此值给予Progressbar.Maximum。似乎不是正确的方法,因为包含“3”行的测试文件返回的文件长度为“305”。我不明白我应该以这种方式给予多少步骤间隔。

代码示例:

FileInfo ff = new FileInfo(openFileDialog1.FileName); 
int fsize= Convert.ToInt32(ff.Length); 
int val=1; 
pgbar_load.Invoke(new MethodInvoker(delegate { pgbar_load.Maximum = fsize; })); 

,并在循环:

++val; 
wk.ReportProgress(val); 

然后:

private void bgwrkr_load_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    pgbar_load.Value = e.ProgressPercentage; 
} 

所以两两件事是我在寻找:

  1. 设置进度条的最大值。
  2. 正确设置步骤索引。

请给我一种前进的方法。

回答

6

保持Progressbar.Maximum为100.然后在int变量中跟踪读取的数据。在UI线程上运行循环(您可以使用计时器来执行此操作),该循环通过检查您的读取字节来设置进度栏百分比的值。例如。假设您将读取的字节存储在int totalRead;中,并且int totalFileSize包含文件的大小。

myProgressBar.Value = Convert.ToInt32(Math.Ceil(100d * totalRead/totalFileSize)); 

你可以把它放在你的计时器滴答事件处理程序中。这将逐步运行进度条到100%。当文件读取完成时,禁用定时器。

+0

我怎样才能每次读取总读取字节,我的意思是int totalRead值?首先,我读取所有文件并将数据存储在通用列表中。然后在一个循环中,我更新了显示进度的datagrid的每一行。 – Cdeez

+0

你可以看看我在做什么的问题中添加的代码。 – Cdeez

+0

对这个答案的编辑很少会给出结果--- 'totalRead'和'totalFilesize'应该是'double'值,因为如果它们是整数,结果总是为零(将结果类型转换为整数)和100d * 0 = 0。和'Math.Ceiling();' – Cdeez