El día de hoy comentare sobre un caso muy usual al trabajar con aplicaciones WindowsForms, por lo menos para mi en .Net 2003, 2005 y 2008.
En el caso que revisare mediante un ejemplo muy sencillo tenemos:
a) Un formulario principal, que alberga un GridControl, y un método de agregado de filas al DataTable que alimenta ese GrigControl.
b) Un formulario secundario que se crea como un objeto desde el formulario principal, y desde el cuál se invocara el método de agregado de filas del GridControl del formulario principal.
1. Como dije, tenemos un DataTable a nivel de clase:
Private dt As New DataTable()
2. Y en el Evento Load del Formulario principal, armamos la estructura de la tabla y agregamos unos registros de prueba :
Try
dt.Columns.Add(New DataColumn("a"))
dt.Columns.Add(New DataColumn("b"))
dt.Columns.Add(New DataColumn("c"))
dt.Rows.Add("1", "2", "3")
dt.Rows.Add("4", "5", "6")
dt.Rows.Add("7", "8", "9")
dt.Rows.Add("10", "11", "12")
gc1.DataSource = dt
Catch ex As Exception
MsgBox(ex.Message)
End Try
3. Como dije anteriormente, tenemos un método para agregar nuevos registros al DataTable:
Public Sub addRow(ByVal val1 As String, ByVal val2 As String, ByVal val3 As String)
Try
dt.Rows.Add(val1, val2, val3)
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
4. Ahora bien, si este método es llamado desde el formulario principal pues todo va bien, pero si instanciamos un nuevo formulario:
Dim f As New Form4
f.Owner = Me
f.Show()
lo más seguro es que estando en el formulario secundario, estemos tentados a invocar al método, de la siguiente manera:
Form2.addRow(TextBox3.Text, TextBox4.Text, TextBox5.Text)
con lo cual, en tiempo de compilación no tendremos ningún problema, sin embargo cuando realicemos el compilado de la aplicación, al ejecutar la aplicación, el método no funciona correctamente. ¿Porqué?
Bueno, pues porque no podemos acceder a los formulario y sus propiedades hacia arriba de forma directa, por lo que es necesario realizar un <casting> obteniendo el nombre del formulario principal, de la propiedad “owner”:
CType(Me.Owner, Form2).addRow(TextBox3.Text, TextBox4.Text, TextBox5.Text)
con lo cual el problema queda resuelto.
Como siempre espero que en algún momento les sea de utilidad
Best regards And Happy coding.
KarlozArba