Mostrando entradas con la etiqueta Recursividad. Mostrar todas las entradas
Mostrando entradas con la etiqueta Recursividad. Mostrar todas las entradas

5 ene 2009

Recursividad + Invoke = Procedimiento Thread Safe

Este es más un apunte que un gran conocimiento, pero puede ayudar a más de uno, la idea es mostrar datos en la UI desde un hilo diferente del principal, por ejemplo: creamos un hilo que se encargue de ir a buscar datos a la BDD y los muestre en una grilla cuando los reciba.

Cuando aprendí a usart Invoke lo que hacía era un método que mostraba los datos en la UI y otro que chequeaba si era necesario utilizar Invoke o no.

Public Sub MostrarDatos(Datos as DataSet)
If Me.InvokeRequired = True Then
Me.Invoke(New SetDataSource_Delegate(AddressOf SetDataSource), Datos)
Else
Me.SetDataSource(Datos)
End If
End Sub


Private Delegate Sub SetDataSource_Delegate(ds As DataSet)

Private Sub SetDataSource(ds As DataSet)
Me.DatagridView1.DataSource = ds
Me.DatagridView1.DataMember = ds.Tables(0).TableName
End Sub


Un tiempo después, como parte de mi eterna búsqueda por escribir mejor código, descubrí que podía simplificar todo eso usando una llamada recursiva y combinando ambos procedimientos en uno solo de la siguiente manera:

Private Delegate Sub MostrarDatos_Delegate(ds As DataSet)


Public Sub MostrarDatos(Datos as DataSet)
If Me.InvokeRequired = True Then
Me.Invoke(New MostrarDatos_Delegate(AddressOf MostrarDatos), Datos)
Else
Me.DatagridView1.DataSource = ds
Me.DatagridView1.DataMember = ds.Tables(0).TableName
End If
End Sub


Como se puede ver, el código queda más legible y no deja de ser eficiente, además de ahorrarnos un par de líneas... que en un formulario muy extenso puede ayudarnos bastante.

21 ago 2008

Función recursiva para limpiar todas las cajas de texto de un Form

Siempre es necesario limpiar cajas de texto en un form, por ejemplo después de cierta acción queremos dejar todas las cajas de texto vacías... pues qué mejor que tener una función que las busque todas??

Public Sub LimpiarCajas(Controls as System.Windows.Forms.Control.ControlCollection)
For each c as Control in Controls
If Not c.Controls Is Nothing AndAlso c.Controls.Count > 0 Then
LimpiarCajas(c.Controls)
ElseIf c.GetType().Equals(GetType(TextBox)) Then
CType(c, TextBox).Text = ""
End If
Next
End Sub


Este procedimiento puede ser muy útil si se lo ubica en un módulo público, de manera que pueda ser utilizado desde cualquier parte de nuestra aplicación. Aunque si trabajan con el framework 3.5 pueden utilizar métodos de extensión como explican en Nuevos Programadores.