Добавление нескольких уровней TreeNode с многопоточностью - PullRequest
0 голосов
/ 27 мая 2019

У меня много проблем с попыткой заставить фонового работника нормально функционировать, чтобы заполнить пару узлов TreeView. В указанном TreeView у меня есть несколько уровней узлов. Например

  • FileName
    • Модель
      • Тест и результат.

Модель относится к модели MicroStation (программа для рисования CAD), проще всего объяснить, что это лист внутри электронной таблицы.

Я использую FileDialog для выбора файлов, после того как файлы выбраны, каждое имя файла добавляется в TreeView со своим собственным узлом.

Идея состоит в том, что программа затем откроет каждый файл, просканирует каждую модель и добавит вспомогательный TreeNode под узлом файлов с типом теста и результатом.

Функция DoWork для фонового работника приведена ниже. Я удалил много кода просто для моего поста. Но есть 7 «тестов», которые выполняет программа, я включил 2. В приведенном ниже примере «CheckFonts» - это функция, которая просто считает элементы текста в файле и возвращает число.

    Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        For i As Integer = 0 To m_CountTo
            If BackgroundWorker1.CancellationPending Then
                e.Cancel = True ' Set Cancel to True
                Exit For
            End If

            Dim sError As String = ""
            Dim bBorderFound As Boolean = False
            Dim oDesignFile As DesignFile
            Dim oModel As ModelReference
            Dim oFontNode As New TreeNode
            Dim oFontResultNode As New TreeNode

            For Each oNode As TreeNode In trvItems.Nodes
                Dim ustn As New MicroStationDGN.Application
                oDesignFile = ustn.OpenDesignFileForProgram(oNode.Text, True)

                For Each oModel In oDesignFile.Models
                    '####### Checks for Items on Default Level #######
                    If bDefaultPass = True Then
                        Dim iDefaultItems As Long
                        iDefaultItems = DefaultItems(oModel)

                        If iDefaultItems > 0 Then
                            sDefaultMessage = "There are " & iDefaultItems & " items on the Default Level"
                            bDefaultPass = False
                        Else
                            sDefaultMessage = "There are no items on the Default Level"
                            bDefaultPass = True
                        End If
                    End If

                    '####### Checks for Non Standard Fonts #######
                    If bFontPass = True Then
                        Dim iFontCheck As Long
                        iFontCheck = CheckFonts(oModel)
                        If iFontCheck > 0 Then
                            sFontMessage = "There are " & iFontCheck & " Text Elements that use a Non Standard Font."
                            bFontPass = False
                        ElseIf iFontCheck = -99999 Then
                            sFontMessage = "There are some corrupt or invalid Fonts used in the Design File"
                            bFontPass = False
                        Else
                            sFontMessage = "All Text Elements use the Correct Font"
                            bFontPass = True
                        End If
                    End If
                Next ' End Model

                oFontNode = oNode.Nodes.Add("Font Check")
                oFontResultNode = oFontNode.Nodes.Add("")
                If bFontPass = True Then
                    oFontResultNode.Text = "PASS - " & sFontMessage
                    oFontResultNode.ImageIndex = 0
                    oNode.Collapse()
                Else
                    oFontResultNode.Text = "FAIL - " & sFontMessage
                    bPass = False
                    oFontResultNode.ImageIndex = 1
                    oFontNode.ImageIndex = 1
                    oNode.Expand()
                    oFontNode.Expand()
                End If

                oDefaultItemsNode = oNode.Nodes.Add("Default Items Check")
                oDefaultItemsResultNode = oDefaultItemsNode.Nodes.Add("")
                If bDefaultPass = True Then
                    oDefaultItemsResultNode.Text = "PASS - " & sDefaultMessage
                    oDefaultItemsResultNode.ImageIndex = 0
                    oNode.Collapse()
                Else
                    oDefaultItemsResultNode.Text = "FAIL - " & sDefaultMessage
                    oDefaultItemsResultNode.ImageIndex = 1
                    oDefaultItemsResultNode.ImageIndex = 1
                    oNode.Expand()
                    bPass = False
                End If
            Next ' End File
        Next

    End Sub

Раньше я работал с фоновыми рабочими, но это немного сложнее того, что я сделал, я понимаю, что вы не можете обновить элементы управления из другого потока и что Invoke используется для передачи ему информации. Но я запутался, как это сделать с несколькими узлами. Лучший пример, который я видел, был здесь

Добавление узлов в древовидную структуру с помощью Begin Invoke / Invoke

Но с несколькими узлами код стал довольно запутанным и не работал. Сообщение об ошибке продолжает появляться относительно вызываемого Invoke / BeginInvoke.

Итак, я думаю, что мой главный вопрос - где я мог бы вызвать команду Invoke, чтобы лучше всего использовать Фоновый рабочий?

Заранее спасибо !!

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