none
Backgroundworker para llenar un Treeview que tarda bastante en cargar. RRS feed

  • Pregunta

  • Hola:

    Tengo un formulario en el que se carga el plan general contable en un treeview, el problema es que se abre el formulario y tarda bastante en mostrar el treeview.

    He estado mirando los temas que hay relacionado con el mío pero no logro que funcione.

    El proceso que tarda bastante tiene parametros y va sacando en la interface las cuentas contables, por lo que no puedo meterlo en el subproceso en segundo plano.

    Para que me muestre el formulario el proceso lo tengo metido en el evento shown.

    Private Sub PGCTreeForm_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
    
            Me.Cursor = Cursors.WaitCursor
    
            ' Llamar al método por primera vez que llenará el TreeView, este método se llamará luego
            ' a sí mismo recurrentemente.
    
            CargarTreeview(1, Nothing, Nothing)
            Me.Cursor = Cursors.Default
    End Sub

    Al evento CargarTreeview que se llama es el siguiente:

    Private Sub CargarTreeview(ByVal nivel As Integer, ByVal nodePadre As TreeNode, ByVal CtaPadre As String)
            Try
                Dim Contex As New GestionLlaveSQLEntities
                Dim q As ObjectResult(Of PGCEmpresa) = Contex.SP_PGCEmpresaNivel(NEmpresaGlobal, nivel, CtaPadre)
    
                ' Agregar al TreeView los nodos Hijos que se han obtenido en el DataView.
                For Each item In q
                    'Exit Sub
                    Dim nuevoNodo As New TreeNode
                    nuevoNodo.Text = item.Cuenta & "-" & item.Descripcion.ToString
                    ' si el parámetro nodoPadre es nulo es porque es la primera llamada, son los Nodos
                    ' del primer nivel que no dependen de otro nodo.
                    If nodePadre Is Nothing Then
                        TreeView1.Nodes.Add(nuevoNodo)
                    Else
                        Dim pos As Integer
                        pos = InStr(nodePadre.Text, "-", CompareMethod.Text)
                        Dim nodoPadreCom As String = Mid(nodePadre.Text, 1, pos - 1)
                        Dim CuentaCom As String = Mid(item.Cuenta, 1, pos - 1)
                        If nodoPadreCom = CuentaCom Then
                           ' se añade el nuevo nodo al nodo padre.
                            nodePadre.Nodes.Add(nuevoNodo)
                        End If
                    End If
                    CargarTreeview(nivel + 1, nuevoNodo, item.Cuenta)
                Next
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
    
        End Sub
    Al tardar tanto al cargar, parece como si se hubiese quedado bloqueada la aplicación. También es puesto el cursor en espera, pero no lo cambia, sigue el cursor como una flechita.

    He intentado poner un progressbar con el estilo marquee antes de empezar el proceso, lo dibuja pero no empieza a moverse hasta que termina de hacer todo el proceso de llenar el treeview.

    Por lo que no se que puedo hacer.

    Un Saludo y muchas gracias.

    • Cambiado Enrique M. Montejo lunes, 25 de noviembre de 2013 18:32 Controles de Windows Forms
    martes, 12 de noviembre de 2013 20:19