每次迭代VB.Net WPF后更新文本框

时间:2018-06-12 17:36:23

标签: wpf vb.net for-loop

我有一个For循环,它运行在目录中的xlsx文件中,我需要在每个循环后在TextBlock中附加文件名并刷新TextBlock以显示更新的文本。

下面的代码只显示循环执行后的文件名。

 Dim lcFileName As String = ""
 Dim fileArray() As String = Directory.GetFiles(txtDirectory.Text, "*.xlsx", SearchOption.AllDirectories)

    For Each file As String In fileArray

        Dim ExcelApp As Excel.Application = New Excel.Application
        Dim Workbook As Excel.Workbook = ExcelApp.Workbooks.Open(file)
        Dim Worksheet As Excel.Worksheet = Workbook.Sheets(1)
        Dim Range As Excel.Range = Worksheet.UsedRange

        Dim rowCount As Integer = Range.Rows.Count
        Dim colCount As Integer = Range.Columns.Count

        Dim tmpOrder(rowCount, colCount) As String
        tbResults.Text = tbResults.Text + Environment.NewLine + Path.GetFileName(file) + " imported."

        For i = 1 To rowCount
            For j = 1 To colCount
                'New line
                If (i = 1 And j = 1) Then
                    tmpOrder(i - 1, j - 1) = Range.Cells(i, j).Value
                    lcFileName = tmpOrder(i - 1, j - 1).ToString()

                Else

                    If (Not String.IsNullOrEmpty(Range.Cells(i, j).Value)) Then
                        tmpOrder(i - 1, j - 1) = Range.Cells(i, j).Value.ToString()
                    End If
                End If
            Next
        Next

        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(Worksheet)
        Worksheet = Nothing
        ExcelApp.ActiveWorkbook.Close(True)
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(Workbook)
        Workbook = Nothing
        ExcelApp.Quit()
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(ExcelApp)
        ExcelApp = Nothing
        '
    Next

任何帮助都将受到赞赏,VB.Net需要。

2 个答案:

答案 0 :(得分:0)

终于搞定了。 好的,首先我创建了我的方法来更新TextBlock,并为文件名传递参数。

Public Sub UpdateResults(ByVal lcFile As String)
    tbResults.Text = tbResults.Text + Environment.NewLine + Path.GetFileName(lcFile) + " imported."
End Sub

在我的For循环中,我使用以下代码调用该方法

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, New ThreadStart(Sub() Me.UpdateResults(lcFile)))

其中UpdateResults(lcFile)是传递的方法和参数。

如果您没有传递任何参数,请使用此方法调用您的方法,其中' MyMethod'是您要运行的方法的名称。

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, New ThreadStart(AddressOf MyMethod))

答案 1 :(得分:-1)

某些东西不能很好地播放,并阻止表单更新。

您可以通过在其中一个循环中添加Application.DoEvents()来允许该应用处理挂起的显示操作。

涉及一些开销,所以你可能想要它在外部循环中,而不是内部循环。