0

i'm having alot of trouble trying to get a background worker properly functioning to populate a couple of TreeView Nodes. In said TreeView i have multiple levels of Nodes. For example

  • FileName
    • Model
      • Test & Result.

Model refers to a MicroStation Model (CAD Drawing Program), easiest way to explain it is a Sheet within a Spreadsheet.

I'm using a FileDialog to select files, once the files are selected each filename is added to the TreeView with its own Node.

The idea is that the program will then open each file, scan each model and add a sub TreeNode under the files Node wih the type of test and the result.

The DoWork function for the Background worker is below. I have removed alot of the code to simply my post. But there are 7 "tests" that the program does, i have included 2. In the below example, "CheckFonts" is a function that just counts the text elements in a file and returns a number.

    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

I have worked with Background Workers before but this is a bit more complex to what i have done, i understand that you cant update controls from a different thread and that Invoke is used to pass it information. But i'm confused how to do it with multiple nodes. The best example I saw was here

Adding nodes to treeview with Begin Invoke / Invoke

But with multiple nodes the code became quite confusing and didn't work. The error message keeps coming up regarding the Invoke / BeginInvoke being called.

So, i guess my main question is where i would call the Invoke command to best make use of the Background worker?

Thanks in advance!!

Rob
  • 99
  • 1
  • 3
  • 12
  • Ok so I didn't check your question completely I just dropped in quick. When you are doing something that needs to be done on the UI (something that you see) just call it like me.begininvoke(sub() treenode.addchild) if there are multiple lines then do me.begininvoke(sub() NewLine #code NewLine End Sub). Invoke to force update, begininvoke to queue and it will be done on next refresh. – CruleD May 27 '19 at 13:13
  • Thanks for the reply. With multiple lines i cant seem to get the me.begininvoke(sub() NewLine #code NewLine End Sub working? In my example above i have probably 40 or 50 lines with different nodes that i need to invoke. Either this or is there a better / easier way for me to add these nodes using different threads? – Rob May 28 '19 at 02:30
  • Is anyone able to assist with this issue? It would be greatly appreciated as i am still struggling with it. – Rob Jun 10 '19 at 08:40

0 Answers0