Обновлять текстовое поле после каждой итерации VB.Net WPF - PullRequest
0 голосов
/ 12 июня 2018

У меня есть цикл 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 голосов
/ 12 июня 2018

Наконец-то все заработало.Хорошо, сначала я создал свой метод для обновления TextBlock с помощью параметра, переданного для имени файла.

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

В цикле For Loop я вызвал метод со следующим кодом

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))
0 голосов
/ 12 июня 2018

Что-то играет не очень хорошо и мешает обновлению формы.

Вы можете разрешить приложению обрабатывать ожидающие операции отображения, добавив Application.DoEvents () внутри одного из циклов.

Это связано с некоторыми накладными расходами, поэтому вы, вероятно, хотите, чтобы они были во внешнем цикле, а не во внутреннем цикле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...