Visual Basic .NET – Carga de Nodos en TreeView a Demanda

Written by lopezatienza on 29/03/2012 – 14:24 -

Comentarios

En este proyecto voy a mostrar la forma, desde mi punto de vista, más elegante de realizar cargas de TreeView mediante un BackgroundWorker utilizando un modelo Maestro / Controlador que tomo como ejemplo Familia de Materiales y Materiales.

La aplicación está desarrollada en VS 2005 Framework 2.0 y accede a un Libro de Excel 8.0

Código

'''
''' Aplicación desarrollada por Antonio López Atienza (https://www.lopezatienza.com) Marzo 2012
''' El código contenido en este proyecto está tal cual sin garantías de ninguna clase.
''' Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar dicho Proyecto.
'''
'''
Public Class frmPrincipal

#Region "Variables Globales"

Dim vConn As New OleDb.OleDbConnection
Dim vCmd As New OleDb.OleDbCommand
Dim vDa As New OleDb.OleDbDataAdapter
Dim vDs As New DataSet

Dim vCargaMaestro As Boolean = True
Dim vNodoSeleccionado As New TreeNode
Dim cuenta As Integer = 100

#End Region

#Region "Manejadores de evenos del Formulario"

Private Sub frmPrincipal_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Try
Me.picCargando.Visible = True
Me.tvMain.Enabled = False
BackgroundWorker1.RunWorkerAsync()
Catch ex As Exception
MessageBox.Show("Excepción controlada: " & ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub

Private Sub tvMain_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles tvMain.AfterSelect
Try
vNodoSeleccionado = e.Node

''Comprobamos que no esté seleccionando un hijo
If vNodoSeleccionado.Parent Is Nothing Then
''Comprobamos que no se hayan cargado ya los hijos
If vNodoSeleccionado.Nodes.Count = 0 Then
' Abrir la conexión, y leer [Hoja 1] del archivo Excel
vCargaMaestro = False
Me.picCargando.Visible = True
Me.tvMain.Enabled = False
BackgroundWorker1.RunWorkerAsync()
End If
End If

Catch ex As Exception
'Aqui va el código que controle la excepción
Finally
vConn.Close()
End Try
End Sub

#End Region

#Region "Funciones del BackgroundWorker"

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Try
Dim i As Integer
If vCargaMaestro Then
CargarDatosMaestro()

cuenta = vDs.Tables("FamiliaMateriales").Rows.Count
For Each vFamilia As DataRow In vDs.Tables("FamiliaMateriales").Rows
Dim vNodoMain As New TreeNode
vNodoMain.Name = vFamilia.Item("IDFamilia")
vNodoMain.Text = vFamilia.Item("Nombre")
AddNode(vNodoMain)

Threading.Thread.Sleep(250)
BackgroundWorker1.ReportProgress(100 * i / cuenta, "Procesando (" & i & "/" & cuenta & ") elementos...")
i += 1
'Me.tvMain.Nodes.Add(vFamilia.Item("IDFamilia"), vFamilia.Item("Nombre"))
Next
Else
CargarDatosDetalle()

cuenta = vDs.Tables("Materiales").Rows.Count
For Each vFilaMaterial As DataRow In vDs.Tables("Materiales").Rows
Dim vNodoMain As New TreeNode
vNodoMain.Name = vFilaMaterial.Item("IDMaterial")
vNodoMain.Text = vFilaMaterial.Item("Nombre")
AddNode(vNodoMain)

Threading.Thread.Sleep(250)
BackgroundWorker1.ReportProgress(100 * i / cuenta, "Procesando (" & i & "/" & cuenta & ") elementos...")
i += 1
'vNodoSeleccionado.Nodes.Add(vFilaMaterial.Item("IDMaterial"), vFilaMaterial.Item("Nombre"))
Next
End If

BackgroundWorker1.ReportProgress(100, "Completado!")
e.Result = True
Catch ex As Exception
e.Result = False
End Try
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
Try
Me.picCargando.Visible = False
Me.tvMain.Enabled = True
Catch ex As Exception
'Me.btnIniciar.Enabled = True
MessageBox.Show("Excepción controlada: " & ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub

Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
Try
BarraDeProgreso.Value = e.ProgressPercentage
lblProgreso.Text = e.UserState
Catch ex As Exception
MessageBox.Show("Excepción controlada: " & ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub

#End Region

#Region "Cargas de datos"

Function CargarDatosMaestro() As Boolean
Try
''Comprobar si el archivo existe
If System.IO.File.Exists(Application.StartupPath & "\Datos.xls") Then

vConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & "\Datos.xls; Extended Properties= Excel 8.0;"

''Conectamos con el Libro Excel y accedemos a la Hoja [FamiliaMateriales$]
vConn.Open()
vCmd.CommandText = "SELECT * FROM [FamiliaMateriales$]"
vCmd.Connection = vConn
vDa.SelectCommand = vCmd

'Llenar el DataSet
vDa.Fill(vDs, "FamiliaMateriales")
Return True
Else
Return False
End If
Catch ex As Exception
'Aqui va el código que controle la excepción
Finally
vConn.Close()
End Try
End Function

Function CargarDatosDetalle() As Boolean
Try
''Comprobar si el archivo existe
If System.IO.File.Exists(Application.StartupPath & "\Datos.xls") Then
'Dimensionar los elementos necesarios para leer y cargar los datos

vConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & "\Datos.xls; Extended Properties= Excel 8.0;"

''Conectamos con el Libro Excel y accedemos a la Hoja [FamiliaMateriales$]
vConn.Open()
vCmd.CommandText = "SELECT * FROM [Materiales$] WHERE IDFamiliaMaterial = '" & vNodoSeleccionado.Name & "'"
vCmd.Connection = vConn
vDa.SelectCommand = vCmd

If Not vDs.Tables("Materiales") Is Nothing Then
vDs.Tables("Materiales").Reset()
End If

'Llenar el DataSet
vDa.Fill(vDs, "Materiales")

Return True
Else
Return False
End If
Catch ex As Exception
'Aqui va el código que controle la excepción
Finally
vConn.Close()
End Try
End Function

#End Region

#Region "Sección Delegate"

Delegate Function AddNodeMainDelegate(ByVal pNodo As TreeNode) As Boolean

Private Function AddNode(ByVal pNodo As TreeNode) As Boolean
If Me.tvMain.InvokeRequired Then
tvMain.Invoke(New AddNodeMainDelegate(AddressOf AddNode), pNodo)
Else
Dim retVal As Boolean = True
Try
If vCargaMaestro Then
Me.tvMain.Nodes.Add(pNodo)
Else
vNodoSeleccionado.Nodes.Add(pNodo)
End If
Catch ex As Exception

End Try
Return retVal
End If
End Function

#End Region

End Class

Framework compatibles

Framework 2.0

Namespaces

System.IO
OleDb

Descargar Proyecto

TreeViewConCargaADemanda.zip

Referencias de interés

---

Autor: Antonio Lopez Atienza


Posted in Visual Basic .NET | No Comments »

Leave a Comment

 

RSS
MCC D5E