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

#1 Jesús López
24/02/2006 - 12:19 | Informe spam
¿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
#2 Mocoyn
24/02/2006 - 13:25 | Informe spam
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
#3 Jorge Serrano [MVP VB]
24/02/2006 - 15:37 | Informe spam
Hola Mocoyn,

prueba el siguiente ejemplo "Demo".

Crea un proyecto Windows con dos formularios.
En el Form1 inserta un control Label y un control Button.
En el Form2 inserta un control Button.

Escribe el siguiente código:

Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim MiF As New Form2
MiF.MiForm1Ref = Me
MiF.Show()
End Sub

Form2
Public MiForm1Ref As Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
MiForm1Ref.Label1.Text = "Prueba"
End Sub

Ejecútalo y pruébalo.

Espero haberte entendido bien y sea esto lo que necesitas.

Un saludo,

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


"Mocoyn" wrote:

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
#4 Jesús López
24/02/2006 - 15:46 | Informe spam
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
#5 Jesús López
24/02/2006 - 15:49 | Informe spam
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
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida