2013-10-25 95 views
2

我有下面的代碼,它是一個解析外部日誌文件到datagridview的代碼,但是當我加載一個大文件時,操作需要時間並且表單凍結了一下,我需要的是顯示一個進度條而它正在解析日誌文件。如何爲此代碼添加BackgroundWorker?

這是代碼:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Try 
      Using Reader As New Microsoft.VisualBasic.FileIO. 
     TextFieldParser(TextBox1.Text) 
       Reader.TextFieldType = 
          Microsoft.VisualBasic.FileIO.FieldType.FixedWidth 

       Reader.SetFieldWidths(Convert.ToInt32(txtDate.Text), Convert.ToInt32(txtTime.Text), Convert.ToInt32(txtExt.Text), Convert.ToInt32(txtCO.Text), _ 
            Convert.ToInt32(txtNumber.Text), Convert.ToInt32(txtDuration.Text), Convert.ToInt32(txtAccCode.Text)) 
       Dim currentRow As String() 
       While Not Reader.EndOfData 
        Try 
         currentRow = Reader.ReadFields() 
         Dim currentField As String 

         For Each currentField In currentRow 
          Dim curRowIndex = dg1.Rows.Add() 
          ' Set the first cell of the new row.... 
          dg1.Rows(curRowIndex).Cells(0).Value = currentRow(0) 
          dg1.Rows(curRowIndex).Cells(1).Value = currentRow(1) 
          dg1.Rows(curRowIndex).Cells(2).Value = currentRow(2) 
          dg1.Rows(curRowIndex).Cells(3).Value = currentRow(3) 
          dg1.Rows(curRowIndex).Cells(4).Value = currentRow(4) 
          dg1.Rows(curRowIndex).Cells(5).Value = currentRow(5) 
          dg1.Rows(curRowIndex).Cells(6).Value = currentRow(6) 
         Next 

        Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException 
         MsgBox("Line " & ex.Message & 
         "is not valid and will be skipped.") 
        End Try 
       End While 
       MsgBox("Total records imported : " & dg1.RowCount) 
       lblTotal.Text = "Total Records: " & dg1.RowCount 

      End Using 
     Catch 
      MsgBox("Invalid file, please make sure you entered the right path") 
     End Try 

    End Sub 

回答

2

添加一個BackgroundWorker及其WorkerReportsProgressProperty設置爲True。

添加進度條。

那就試試這個代碼了:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Try 
      Dim widths() As Integer = { _ 
       Convert.ToInt32(txtDate.Text), Convert.ToInt32(txtTime.Text), Convert.ToInt32(txtExt.Text), _ 
       Convert.ToInt32(txtCO.Text), Convert.ToInt32(txtNumber.Text), Convert.ToInt32(txtDuration.Text), _ 
       Convert.ToInt32(txtAccCode.Text)} 
      ProgressBar1.Visible = True 
      ProgressBar1.Style = ProgressBarStyle.Marquee ' continuos animation 
      Dim input As New Tuple(Of String, Integer())(TextBox1.Text, widths) 
      BackgroundWorker1.RunWorkerAsync(input) 
     Catch ex As Exception 
      MessageBox.Show("Invalid Width!") 
     End Try 
    End Sub 

    Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork 
     Dim input As Tuple(Of String, Integer()) = DirectCast(e.Argument, Tuple(Of String, Integer())) 
     Try 
      Using Reader As New Microsoft.VisualBasic.FileIO.TextFieldParser(input.Item1) 
       Reader.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.FixedWidth 
       Reader.SetFieldWidths(input.Item2) 
       Dim currentRow() As String 
       While Not Reader.EndOfData 
        Try 
         currentRow = Reader.ReadFields() 
         BackgroundWorker1.ReportProgress(-1, New Object() { _ 
          currentRow(0), currentRow(1), currentRow(2), _ 
          currentRow(3), currentRow(4), currentRow(5), _ 
          currentRow(6)}) 
        Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException 
         MessageBox.Show("Line is not valid and will be skipped." & vbCrLf & vbCrLf & ex.Message) 
        End Try 
       End While 
      End Using 
     Catch 
      MsgBox("Invalid file, please make sure you entered the right path") 
     End Try 
    End Sub 

    Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged 
     Dim values() As Object = DirectCast(e.UserState, Object()) 
     dg1.Rows.Add(values) 
    End Sub 

    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted 
     MessageBox.Show("Total records imported : " & dg1.RowCount) 
     lblTotal.Text = "Total Records: " & dg1.RowCount 
     ProgressBar1.Style = ProgressBarStyle.Continuous 
     ProgressBar1.Visible = False 
    End Sub 
+0

感謝您的代碼,但它現在只增加一個字段的第一列和值是System.Object的[] – Lebnani

+0

我更新了ProgressChanged()事件。看看這是否更好。 –