2012-09-16 59 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