Actualizar Formulario desde otro formulario

23/02/2006 - 20:40 por Mocoyn | Informe spam
Hola, uso visual basic .NET 2003, y quiero actualizar una barra de estado y 2
datagrids de un formulario (1) ya abierto, desde otro formulario (2). He
probado creando instancias de esta manera, con este codigo:
Private Shared mDefInstance As MDIPrincipal
Public Shared Property DefInstance() As MDIPrincipal
Get
If mDefInstance Is Nothing Then
mDefInstance = New MDIPrincipal
End If
Return mDefInstance
End Get
Set(ByVal Value As MDIPrincipal)
mDefInstance = Value
End Set
End Property

Protected Overrides Sub OnClosed(ByVal e As System.EventArgs)
MyBase.OnClosed(e)
mDefInstance = Nothing
End Sub


y cuando accedo desde el formulario (2) al formulario (1), consigo verlo
poniendo, formulario.definstance.barra_estado pero no consigo que se
actualice.
Para el caso de los datagrids, uso unas funciones que los cargan. Espero su
ayuda, grcias.

Preguntas similare

Leer las respuestas

#6 Jorge Serrano [MVP VB]
24/02/2006 - 17:48 | Informe spam
¿No te llegó mi mensaje de email?

Espero poder enviártelo en un ratillo nuevamente. ;-)

Jorge Serrano Pérez
Microsoft MVP VB.NET
PortalVB.com
http://www.portalvb.com/
Weblog de Jorge Serrano
http://weblogs.golemproject.com/jorge/


"Jesús López" wrote:

Jorge,

¿Cual es tu dirección de correo para enviarte el generador de clases para
procedimientos almacenados y que lo pucliques en tu web.?

Un abrazo

Jesús




Respuesta Responder a este mensaje
#7 Mocoyn
24/02/2006 - 19:05 | Informe spam
Me vale, casi, lo que me has dicho, me es de gran utilidad, pero como ejecuto
una funcion mia propia que se encuentra desde el formulario(1) desde el
formulario(2) y que me carga un datagrid, que tengo en el formulario(1)?

"Jesús López" escribió:

Si es el que inicia el proyecto, entonces en el evento load del formulario
1, o mejor le llamamos formulario principal, tienes la oportunidad de
asignar la propia instancia del formulario a una variable estática que pueda
ser accedida desde cualquier parte del programa.

Más o menos así:

Public Class FormularioPrincipal
Inherits Form

...

Private Shared mInstancia As FormularioPrincial
Public Shared ReadOnly Property Instancia As FormularioPrincipal
Get
Return mInstancia
End Get
End Property

Public Function Saludar() As String
Return "Hola desde el formulario principal"
End Function

Private Sub Form_Load( Sender As Object, e As EventArgs) Handles
MyBase.Load
mInstancia = Me
End Sub

.
End Class


Luego desde cualquier otro formulario o desde cualquier otro punto del
programa podrás acceder a la instancia del formulario principal, siempre que
lo hagas después de que se haya producido el evento Load del formulario
princiapal. De la siguiente manera:


Sub UnaSubEnCualquierSitio()
MsgBox FormularioPrincipal.Instancia.Saludar()
End Sub

Te sugiero esta manera, porque la instancia del formulario principal no la
creas tú, sino que la crea internamente el sistema cuando empieza la
aplicación. Así que no tienes la oportunidad de guardar una referencia a la
instancia del formulario en el momento de la creación.

O sea, si fueras tú el que hiciera:

Dim frm As New FormularioPrincipal()
frm.Show()

Podrías guardar la instancia antes

Dim frm As New FormularioPrincipal
UnaVariableGlobal = frm
frm.Show()


Y luego acceder a la variable UnaVaribleGlobal desde cualquier punto del
programa.

En realidad, En VB 2003 puedes ser tú perfectamente el que instancie el
formulario principal. Para ello añades un módulo al projecto con este
código:

Module MainModule
Private mInstanciaFormularioPrincipal As FormularioPrincipal
Public ReadOnly Property InstanciaFormularioPrincipal As
FormularioPrinciapal
Get
return mInstanciaFormularioPrincipal
End Get
End Property

Sub Main()
Dim frm As New FormularioPrincipal
mInstanciaFormularioPrincipal = frm
Application.Run( frm )
End Sub
End Module

Luego en las propiedades del proyecto estableces Sub Main como objeto
inicial.

Y así podrías en cualquier punto del programa:

Sub UnaSubEnCualquierSitio()
MsgBox InstanciaFormularioPrincipal.Saludar()
End Sub

Espero haberte aclarado un poco las cosas.


Saludos:

Jesús López
MVP

"Mocoyn" escribió en el mensaje
news:
> El codigo, lo tengo en el formulario (1), y creo q ya te entiendo, pero
> ¿¿como hago para que no sea un variable local?? Mi formulario (1), es con
> el
> que inicio el programa, el que inicia el proyecto.
>
> "Jesús López" escribió:
>
>> ¿Y donde tienes ese código?
>>
>> Este es un problema típico de alcance (scope). Desde el formulario que
>> quieres acceder al otro formulario tienes que poder tener acceso a una
>> variable que haga referencia a la instancia del formulario.
>>
>> Si en un punto del programa creas el formulario con una variable local.
>> Como
>> las variables locales sólo son accesibles desde el metodo que las
>> declaras,
>> no abrá manera que acceder de nuevo a ella
>>
>> Por ejemplo, si haces así:
>>
>> Sub CrearFormulario()
>> Dim frm As New Form1()
>> frm.Show()
>> End Sub
>>
>> La referencia al formulario frm, se habrá perdido para siempre y no
>> podrás
>> acceder al formulario.
>>
>> Cuando creas el formulario tienes que guardar la referencia en algún
>> sitio
>> que esté accesible.
>>
>>
>> Probablemente, lo que esé ocurriendo es que la aplicación crea una
>> instancia
>> del formulario principal al comienzo de la aplicación. Y cuando accedes a
>> Formulario.DefIntance se está creando un nuevo formulario y estás
>> accediendo
>> a una instancia diferente, por eso no se actualiza
>>
>> Saludos:
>>
>> Jesús López
>> MVP VB
>> Solid Quality Learning
>> www.solidqualitylearning.com
>>
>>
>>
>> "Mocoyn" wrote:
>>
>> > Hola, uso visual basic .NET 2003, y quiero actualizar una barra de
>> > estado y 2
>> > datagrids de un formulario (1) ya abierto, desde otro formulario (2).
>> > He
>> > probado creando instancias de esta manera, con este codigo:
>> > Private Shared mDefInstance As MDIPrincipal
>> > Public Shared Property DefInstance() As MDIPrincipal
>> > Get
>> > If mDefInstance Is Nothing Then
>> > mDefInstance = New MDIPrincipal
>> > End If
>> > Return mDefInstance
>> > End Get
>> > Set(ByVal Value As MDIPrincipal)
>> > mDefInstance = Value
>> > End Set
>> > End Property
>> >
>> > Protected Overrides Sub OnClosed(ByVal e As System.EventArgs)
>> > MyBase.OnClosed(e)
>> > mDefInstance = Nothing
>> > End Sub
>> >
>> >
>> > y cuando accedo desde el formulario (2) al formulario (1), consigo
>> > verlo
>> > poniendo, formulario.definstance.barra_estado pero no consigo que
>> > se
>> > actualice.
>> > Para el caso de los datagrids, uso unas funciones que los cargan.
>> > Espero su
>> > ayuda, grcias.



Respuesta Responder a este mensaje
#8 Jesús López
24/02/2006 - 19:17 | Informe spam
De igual forma que lo está haciendo en el ejemplo UnaSubCualquiera. Esta sub
cualquiera, como su nombre indica puede estar en cualquier sito, por ejemplo
podría ser el procedimiento de evento de un botón en el formulario 2.

En el formulario 2 tendríamos
Public Class Formulario2
Private Sub Boton1_Click(Sender As Object, e As EventArgs)
FormularioPrincipal.LaFuncionDelFormulario1QueHaceEsoQueDices()
End Sub
End Class

En el formulario 1 que es el formulario principal tenemos lo que te he dicho
en el mensaje anterior más:

Public Class FormularioPrincipal (es el formulario 1)

... Todo lo del mensaje anterior

Public Sub LaFuncionDelFormulario1QueHaceEsoQueDices()
' Hacer eso que dices que hace
End Sub
End Class


O sea que es exáctemente el patrón que te he mostrado en el mensaje
anterior.

Saludos:

Jesús López



"Mocoyn" escribió en el mensaje
news:
Me vale, casi, lo que me has dicho, me es de gran utilidad, pero como
ejecuto
una funcion mia propia que se encuentra desde el formulario(1) desde el
formulario(2) y que me carga un datagrid, que tengo en el formulario(1)?

"Jesús López" escribió:

Si es el que inicia el proyecto, entonces en el evento load del
formulario
1, o mejor le llamamos formulario principal, tienes la oportunidad de
asignar la propia instancia del formulario a una variable estática que
pueda
ser accedida desde cualquier parte del programa.

Más o menos así:

Public Class FormularioPrincipal
Inherits Form

...

Private Shared mInstancia As FormularioPrincial
Public Shared ReadOnly Property Instancia As FormularioPrincipal
Get
Return mInstancia
End Get
End Property

Public Function Saludar() As String
Return "Hola desde el formulario principal"
End Function

Private Sub Form_Load( Sender As Object, e As EventArgs) Handles
MyBase.Load
mInstancia = Me
End Sub

.
End Class


Luego desde cualquier otro formulario o desde cualquier otro punto del
programa podrás acceder a la instancia del formulario principal, siempre
que
lo hagas después de que se haya producido el evento Load del formulario
princiapal. De la siguiente manera:


Sub UnaSubEnCualquierSitio()
MsgBox FormularioPrincipal.Instancia.Saludar()
End Sub

Te sugiero esta manera, porque la instancia del formulario principal no
la
creas tú, sino que la crea internamente el sistema cuando empieza la
aplicación. Así que no tienes la oportunidad de guardar una referencia a
la
instancia del formulario en el momento de la creación.

O sea, si fueras tú el que hiciera:

Dim frm As New FormularioPrincipal()
frm.Show()

Podrías guardar la instancia antes

Dim frm As New FormularioPrincipal
UnaVariableGlobal = frm
frm.Show()


Y luego acceder a la variable UnaVaribleGlobal desde cualquier punto del
programa.

En realidad, En VB 2003 puedes ser tú perfectamente el que instancie el
formulario principal. Para ello añades un módulo al projecto con este
código:

Module MainModule
Private mInstanciaFormularioPrincipal As FormularioPrincipal
Public ReadOnly Property InstanciaFormularioPrincipal As
FormularioPrinciapal
Get
return mInstanciaFormularioPrincipal
End Get
End Property

Sub Main()
Dim frm As New FormularioPrincipal
mInstanciaFormularioPrincipal = frm
Application.Run( frm )
End Sub
End Module

Luego en las propiedades del proyecto estableces Sub Main como objeto
inicial.

Y así podrías en cualquier punto del programa:

Sub UnaSubEnCualquierSitio()
MsgBox InstanciaFormularioPrincipal.Saludar()
End Sub

Espero haberte aclarado un poco las cosas.


Saludos:

Jesús López
MVP

"Mocoyn" escribió en el mensaje
news:
> El codigo, lo tengo en el formulario (1), y creo q ya te entiendo, pero
> ¿¿como hago para que no sea un variable local?? Mi formulario (1), es
> con
> el
> que inicio el programa, el que inicia el proyecto.
>
> "Jesús López" escribió:
>
>> ¿Y donde tienes ese código?
>>
>> Este es un problema típico de alcance (scope). Desde el formulario que
>> quieres acceder al otro formulario tienes que poder tener acceso a una
>> variable que haga referencia a la instancia del formulario.
>>
>> Si en un punto del programa creas el formulario con una variable
>> local.
>> Como
>> las variables locales sólo son accesibles desde el metodo que las
>> declaras,
>> no abrá manera que acceder de nuevo a ella
>>
>> Por ejemplo, si haces así:
>>
>> Sub CrearFormulario()
>> Dim frm As New Form1()
>> frm.Show()
>> End Sub
>>
>> La referencia al formulario frm, se habrá perdido para siempre y no
>> podrás
>> acceder al formulario.
>>
>> Cuando creas el formulario tienes que guardar la referencia en algún
>> sitio
>> que esté accesible.
>>
>>
>> Probablemente, lo que esé ocurriendo es que la aplicación crea una
>> instancia
>> del formulario principal al comienzo de la aplicación. Y cuando
>> accedes a
>> Formulario.DefIntance se está creando un nuevo formulario y estás
>> accediendo
>> a una instancia diferente, por eso no se actualiza
>>
>> Saludos:
>>
>> Jesús López
>> MVP VB
>> Solid Quality Learning
>> www.solidqualitylearning.com
>>
>>
>>
>> "Mocoyn" wrote:
>>
>> > Hola, uso visual basic .NET 2003, y quiero actualizar una barra de
>> > estado y 2
>> > datagrids de un formulario (1) ya abierto, desde otro formulario
>> > (2).
>> > He
>> > probado creando instancias de esta manera, con este codigo:
>> > Private Shared mDefInstance As MDIPrincipal
>> > Public Shared Property DefInstance() As MDIPrincipal
>> > Get
>> > If mDefInstance Is Nothing Then
>> > mDefInstance = New MDIPrincipal
>> > End If
>> > Return mDefInstance
>> > End Get
>> > Set(ByVal Value As MDIPrincipal)
>> > mDefInstance = Value
>> > End Set
>> > End Property
>> >
>> > Protected Overrides Sub OnClosed(ByVal e As System.EventArgs)
>> > MyBase.OnClosed(e)
>> > mDefInstance = Nothing
>> > End Sub
>> >
>> >
>> > y cuando accedo desde el formulario (2) al formulario (1), consigo
>> > verlo
>> > poniendo, formulario.definstance.barra_estado pero no consigo
>> > que
>> > se
>> > actualice.
>> > Para el caso de los datagrids, uso unas funciones que los cargan.
>> > Espero su
>> > ayuda, grcias.



Respuesta Responder a este mensaje
#9 Jesús López
24/02/2006 - 23:58 | Informe spam
Corrijo:

Public Class Formulario2
Private Sub Boton1_Click(Sender As Object, e As EventArgs)
FormularioPrincipal.Instancia.LaFuncionDelFormulario1QueHaceEsoQueDices()
End Sub
End Class



"Jesús López" escribió en el mensaje
news:%
De igual forma que lo está haciendo en el ejemplo UnaSubCualquiera. Esta
sub cualquiera, como su nombre indica puede estar en cualquier sito, por
ejemplo podría ser el procedimiento de evento de un botón en el formulario
2.

En el formulario 2 tendríamos
Public Class Formulario2
Private Sub Boton1_Click(Sender As Object, e As EventArgs)
FormularioPrincipal.LaFuncionDelFormulario1QueHaceEsoQueDices()
End Sub
End Class

En el formulario 1 que es el formulario principal tenemos lo que te he
dicho en el mensaje anterior más:

Public Class FormularioPrincipal (es el formulario 1)

... Todo lo del mensaje anterior

Public Sub LaFuncionDelFormulario1QueHaceEsoQueDices()
' Hacer eso que dices que hace
End Sub
End Class


O sea que es exáctemente el patrón que te he mostrado en el mensaje
anterior.

Saludos:

Jesús López



"Mocoyn" escribió en el mensaje
news:
Me vale, casi, lo que me has dicho, me es de gran utilidad, pero como
ejecuto
una funcion mia propia que se encuentra desde el formulario(1) desde el
formulario(2) y que me carga un datagrid, que tengo en el formulario(1)?

"Jesús López" escribió:

Si es el que inicia el proyecto, entonces en el evento load del
formulario
1, o mejor le llamamos formulario principal, tienes la oportunidad de
asignar la propia instancia del formulario a una variable estática que
pueda
ser accedida desde cualquier parte del programa.

Más o menos así:

Public Class FormularioPrincipal
Inherits Form

...

Private Shared mInstancia As FormularioPrincial
Public Shared ReadOnly Property Instancia As FormularioPrincipal
Get
Return mInstancia
End Get
End Property

Public Function Saludar() As String
Return "Hola desde el formulario principal"
End Function

Private Sub Form_Load( Sender As Object, e As EventArgs) Handles
MyBase.Load
mInstancia = Me
End Sub

.
End Class


Luego desde cualquier otro formulario o desde cualquier otro punto del
programa podrás acceder a la instancia del formulario principal, siempre
que
lo hagas después de que se haya producido el evento Load del formulario
princiapal. De la siguiente manera:


Sub UnaSubEnCualquierSitio()
MsgBox FormularioPrincipal.Instancia.Saludar()
End Sub

Te sugiero esta manera, porque la instancia del formulario principal no
la
creas tú, sino que la crea internamente el sistema cuando empieza la
aplicación. Así que no tienes la oportunidad de guardar una referencia a
la
instancia del formulario en el momento de la creación.

O sea, si fueras tú el que hiciera:

Dim frm As New FormularioPrincipal()
frm.Show()

Podrías guardar la instancia antes

Dim frm As New FormularioPrincipal
UnaVariableGlobal = frm
frm.Show()


Y luego acceder a la variable UnaVaribleGlobal desde cualquier punto del
programa.

En realidad, En VB 2003 puedes ser tú perfectamente el que instancie el
formulario principal. Para ello añades un módulo al projecto con este
código:

Module MainModule
Private mInstanciaFormularioPrincipal As FormularioPrincipal
Public ReadOnly Property InstanciaFormularioPrincipal As
FormularioPrinciapal
Get
return mInstanciaFormularioPrincipal
End Get
End Property

Sub Main()
Dim frm As New FormularioPrincipal
mInstanciaFormularioPrincipal = frm
Application.Run( frm )
End Sub
End Module

Luego en las propiedades del proyecto estableces Sub Main como objeto
inicial.

Y así podrías en cualquier punto del programa:

Sub UnaSubEnCualquierSitio()
MsgBox InstanciaFormularioPrincipal.Saludar()
End Sub

Espero haberte aclarado un poco las cosas.


Saludos:

Jesús López
MVP

"Mocoyn" escribió en el mensaje
news:
> El codigo, lo tengo en el formulario (1), y creo q ya te entiendo,
> pero
> ¿¿como hago para que no sea un variable local?? Mi formulario (1), es
> con
> el
> que inicio el programa, el que inicia el proyecto.
>
> "Jesús López" escribió:
>
>> ¿Y donde tienes ese código?
>>
>> Este es un problema típico de alcance (scope). Desde el formulario
>> que
>> quieres acceder al otro formulario tienes que poder tener acceso a
>> una
>> variable que haga referencia a la instancia del formulario.
>>
>> Si en un punto del programa creas el formulario con una variable
>> local.
>> Como
>> las variables locales sólo son accesibles desde el metodo que las
>> declaras,
>> no abrá manera que acceder de nuevo a ella
>>
>> Por ejemplo, si haces así:
>>
>> Sub CrearFormulario()
>> Dim frm As New Form1()
>> frm.Show()
>> End Sub
>>
>> La referencia al formulario frm, se habrá perdido para siempre y no
>> podrás
>> acceder al formulario.
>>
>> Cuando creas el formulario tienes que guardar la referencia en algún
>> sitio
>> que esté accesible.
>>
>>
>> Probablemente, lo que esé ocurriendo es que la aplicación crea una
>> instancia
>> del formulario principal al comienzo de la aplicación. Y cuando
>> accedes a
>> Formulario.DefIntance se está creando un nuevo formulario y estás
>> accediendo
>> a una instancia diferente, por eso no se actualiza
>>
>> Saludos:
>>
>> Jesús López
>> MVP VB
>> Solid Quality Learning
>> www.solidqualitylearning.com
>>
>>
>>
>> "Mocoyn" wrote:
>>
>> > Hola, uso visual basic .NET 2003, y quiero actualizar una barra de
>> > estado y 2
>> > datagrids de un formulario (1) ya abierto, desde otro formulario
>> > (2).
>> > He
>> > probado creando instancias de esta manera, con este codigo:
>> > Private Shared mDefInstance As MDIPrincipal
>> > Public Shared Property DefInstance() As MDIPrincipal
>> > Get
>> > If mDefInstance Is Nothing Then
>> > mDefInstance = New MDIPrincipal
>> > End If
>> > Return mDefInstance
>> > End Get
>> > Set(ByVal Value As MDIPrincipal)
>> > mDefInstance = Value
>> > End Set
>> > End Property
>> >
>> > Protected Overrides Sub OnClosed(ByVal e As System.EventArgs)
>> > MyBase.OnClosed(e)
>> > mDefInstance = Nothing
>> > End Sub
>> >
>> >
>> > y cuando accedo desde el formulario (2) al formulario (1), consigo
>> > verlo
>> > poniendo, formulario.definstance.barra_estado pero no consigo
>> > que
>> > se
>> > actualice.
>> > Para el caso de los datagrids, uso unas funciones que los cargan.
>> > Espero su
>> > ayuda, grcias.









Respuesta Responder a este mensaje
#10 Mocoyn
25/02/2006 - 01:23 | Informe spam
He visto tu solucion, y hago lo que me dices y no me funciona, te escribo, lo
que hago: (No me funciona al llamar a la funcion Cargar_Datagrid_TablasBD)

En el formulario 1
Public Class Form_Actualiz1
Private Shared mDefInstance As Form_Actualiz1
Public Shared ReadOnly Property Instancia() As Form_Actualiz1
Get
Return mDefInstance
End Get
End Property

Protected Overrides Sub OnClosed(ByVal e As System.EventArgs)
MyBase.OnClosed(e)
mDefInstance = Nothing
End Sub

Public Sub Cargar_Datagrid_TablasBD()
On Error GoTo fallo
Dim ds As DataSet = New DataSet

var.bd.Ejecutar3("SELECT TABLA,ACTUALIZADA FROM TMPTABLASBD", ds,
"TmpTablasBD")
DataGrid1.SetDataBinding(ds, "TmpTablasBD")
ds.Dispose()

fallo:
If (Err.Number <> 0 And Err.Number <> 20) Then
MsgBox("Se ha producido un error " & Err.Number.ToString & " " &
Err.Description, , )
End If
End Sub


Formulario2
Public sub (Al salir)

GestionExcel.Form_Actualiz1.Instancia.Cargar_Datagrid_TablasBD()
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida