2013-10-25 5 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에 추가하고 True로 WorkerReportsProgressProperty을 설정

는 코드입니다.

ProgressBar를 추가하십시오. 코드에 대한

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

감사합니다,하지만 지금은 1 열에 하나의 필드를 추가이고 값은 System.Object []를 – Lebnani

+0

나는 ProgressChanged() 이벤트를 업데이트됩니다

그런 다음이 코드를보십시오. 그게 더 나아 졌는지 봐. –

관련 문제