none
Como obtener uan variable pública desde un USERCONTROL RRS feed

  • Pregunta

  • Hola a todos,

    Tengo un problema con una variable pública que no puede ser tomada desde un USERCONTROL, les paso un pequeño ejemplo de lo que quiero hacer:

    Class

     

    MainWindow

    Public

     

    Var as

    Integer

     

    Private

     

    Sub Window_Loaded(ByVal sender as Object, ByVal e as

    System.Windows.RoutedEventArgs)

    Var=

    50

    numero.Text=Var

    End

     

    Sub

     

    Private

     

    Sub Button_Click(ByVal sender as Object, ByVal e as

    System.Windows.RoutedEventArgs)

    End

    End

     

    Sub

     

    Private

     

    Sub BtUser_Click(ByVal sender as Object, ByVal e as

    System.Windows.RoutedEventArgs)

     

    'Se agrega el User control en un Grid de MainWindow

     

    Dim vista = New

    UserControl1

    vista.TbUser.Text=Var

    GrdPrincipal.Children.Clear()

    GrdPrincipal.Children.Add(

    New

    UserControl1())

    End

     

    Sub

     

    Private

     

    Sub abrir_Click(ByVal sender as Object, ByVal e as

    System.Windows.RoutedEventArgs)

     

    Dim veo =new

    Window1

    veo.TbWin.Text=Var

    veo.Show()

    End

     

    Sub

     

    End

     

    Class

     

     

    Para este ejemplo tenemos un MainWindow con una varaible pública "Var" y una asigncaión de valor de "50", tambien una ventana Window1 que tiene un textBox "TbWin" que le asigno el valor de la variable "Var" de MainWindow. Hasta aqui no tengo ningún problema, toma el valor de la variable pública a través de un botón "abrir" de MainWindow.

    El problema que tengo es que quiero hacer la misma operación con un UserControl "UserControl1" , este también tiene un textbox "TbUser" al cual queiro asignarle el valor de la variable Var, pero no me toma el valor, solo me da valor "0".

    Espero que alguien me pueda ayudar,

    Gracias,

    Carlo Rodríguez 

    martes, 29 de marzo de 2011 20:50

Respuestas

  • Hola revisa esta sección:

     Dim Usc = New Datos
        'aqui envío el valor de la variable píblica "Var"
        Usc.TbUscCodUsuario.Text = var
        'aqui envío el valor del Promoción a el Usercontrol "Datos" 
        Usc.TbUscPromoción.Text = TbPromoción.Text
        'aqui envío el valor del Promoción a el Usercontrol "Datos"
        Usc.TbUscCostoPromoción.Text = TbCosto.Text
    		GrdPrincipal.Children.Clear()
        GrdPrincipal.Children.Add(Usc)
    

    Antes estaba así:

             GrdPrincipal.Children.Add(new Datos())

    Como adivinaras no hay error, solo que siempre por más que cargues los datos, estarás creando una nueva instancía, por lo tanto no estas asociando el control que se quiere crear dinamicamente. Revisa el tema de binding.... pues cuando trabajas con una tecnología como WPF no estaría bien pasar parametros forzados, más bien establecer un binding TwoWay para que si modificas de un lado el objeto se de por enterado del cambio. Pero en fin con lo que te puse arriba podras solucionar tu problema inmediato.

    Saludos


    Custom Control Silverlight
    "Blog Ingphillip's Prog: TODO WEB
    • Propuesto como respuesta Felipe Sotelo S lunes, 4 de abril de 2011 3:35
    • Marcado como respuesta carloro lunes, 4 de abril de 2011 15:38
    lunes, 4 de abril de 2011 3:34

Todas las respuestas

  • Podrías hacer lo siguiente.

    A tu user control cuando lo agregas ponle un Name;

    UserControl1.Name = "NombreUserControl"

    Así podrías recuperar tu objeto

    Dim miUserControl As UserControl = GrdPrincipal.OfType(Of UserControl)().Where(Function(userControl) _
                                                                                                                   userControl.Name = "NombreUserControl").First()

    Documentación

    OfType

    Saludos!!!


    Custom Control Silverlight
    "Blog Ingphillip's Prog: TODO WEB
    • Propuesto como respuesta Felipe Sotelo S miércoles, 30 de marzo de 2011 1:07
    miércoles, 30 de marzo de 2011 1:07
  • Hola Felipe,

    Muchas gracias por responder.

    La verdad no etiendo como puedo rescatar la variable pública "Var" que esta en MainWindow, no se si me pudes explicar un poquito más tu propuesta.

    Saludos y muchas gracias,

    Carlo Rodriguez

    miércoles, 30 de marzo de 2011 13:48
  • Hola nuevamente,

    Por favor hay alguien que me pueda ayudar, no encuentro una solución...

    Queria acotar que cuando inserto el usercontrol a MainWindow...

    <MiProyecto:UserControl x:name"UnNombre"/>

    y luego genero el evento load de "UnNombre", puedo recuperar la variable, el problema esta cuando lo genero de forma dinámica o en ejecución.

    Ojala me puedan ayudar.

    Saludos,

    Carlo Rodriguez

    jueves, 31 de marzo de 2011 20:53
  • Tienes que buscar el objeto en el àrbol visual por eso te digo el control que agregaste dinamicamente tiene que residir en algùn contenedor principal, bien sea un Grid o StackPanel por ejemplo entonces si sabes quien contiene ese "objeto" pues en este "objeto" en su propiedad Children la cual es una collection de Frameworks elements, entonces mediante linq podrìas llegar a este "objeto" y luego poderle hacer un cast y asì obetener la propiedad publica de este.

    Entonces en C# serìa algo asi

    Inicalizas una clase de tipo "objeto" el cual agregaste y quieres recuperar

    UserControl1 userControlAdded =  ContenerdorGridOStackPanelEjemplo.Children.OfType<UserControl1>().First(); 0  si sabes el nombre es decir la propiedad Name

    UserControl1 userControlAdded =  ContenerdorGridOStackPanelEjemplo.Children.OfType<UserControl1>().Where(c => c.Name == "ElNombreDelControl");

    MessageBox.Show(userControlAdded.AquiPropiedad );

    Ahora En VB no lo conozco muy bien pero el principio es el mismo.

    Dim miUserControl As UserControl = GrdPrincipal.OfType(Of UserControl)().Where(Function(userControl) _
                                                                                                                   userControl.Name = "NombreUserControl").First()

    Para poder hacer uso de Linq debes tener entre tus referencia System.Linq y agegar el respectivo import o using en C#.


    Custom Control Silverlight
    "Blog Ingphillip's Prog: TODO WEB
    jueves, 31 de marzo de 2011 21:44
  • Hola Felipe,

    Muchas gracias por tu apoyo

    puse esta línea en Vb.net:

    Dim

    miUserControl As UserControl1 = GrdPrincipal.Children.OfType(Of UserControl1)().Where(Function(userControl) userControl.Name = "NombreUser").First()

    y me da el siguiente error: "la secuencia no contiene elementos"

    Saludos y gracias,

    Carlo Rodriguez

    viernes, 1 de abril de 2011 14:32
  • Hola si te responde esto es por que efectivamente ya estas buscando en la colección de objeto, entonces

    1- Verifica que el nombre de el UserControl1 que agregas antes sea este es decir que hayas cargado UserControl.Name = "ElNombreQueQuiera".

    2- Pon un punto de interrupción en la linea y cuando entre allí ispecciona que GrdPrincipal.Children.Count se mayor a 0 es decir que realmente estes buscando sobre un conjunto existente de objetos.

    3- En la sección OfType(Of ElTipo_TuTipo) es decir si yo quisiera buscar un objeto de la clase persona por ejemplo... serìa OfType(Of Persona), en tu caso si el control que agregas es de tipo UserContro1 deberìa ser OfType(Of UserControl1)

    Saludos


    Custom Control Silverlight
    "Blog Ingphillip's Prog: TODO WEB
    viernes, 1 de abril de 2011 15:17
  • Gracias Felipe,

    Intente de muchas maneras y la verdad me sale el mismo error, posiblemente mi falta de conocimientos hace que no pueda ver al solución.

    La aplicación que estoy desarrollando en WPF ya la tengo en Winforms, y me funciona perfecto, lo que pasa es que cuando ingreso a la aplicación ingreso el usuario y el pasword, al hacer click en aceptar, verifica la base através de un Store Procedure los datos, si todo es correcto este botón pasa el codigo del usuario a una variable publica que esta alojada en el MainWindow. hata aqui todo me hace perfecto.

    Pero cuando cargo el Usercontrol1 de forma dinamica, necesito que este pueda leer la variable pública y alojarla en un textbox de el user control1. cuando hago puntos de interrupción en la linea que inserta la variable me marca el valor de la variable "50" por ejemplo, pero al momento de cargar el usercontrol1 este valor se pierde y ya no me inserta en el textbox.

    Cuando trabaje con el mismo usercontrol agragado por codigo, le dí un nombre al UserControl1 "user" por ejemplo, a este control "user" le hice el evento load en sus propiedades, e invoque al textbox, y ahi me funciono perfecto, me tomo el valor de la variable pública.

    Espero resolver este problema, que ya me tiene desesperado.

    Un saludo,

    Carlo Rodriguez

    Si necesitas que te pase el Codigo completo me avisas. te puedo mandar un Zip a tu correo 

     

    viernes, 1 de abril de 2011 22:10
  • Ok ponlo en tu skydrive y me pasas la dirección
    Custom Control Silverlight
    "Blog Ingphillip's Prog: TODO WEB
    sábado, 2 de abril de 2011 1:26
  • Hola Felipe,

    Gracias nuevamente, estoy creando una pequeña aplicación para poder enviartela, ya que la que tengo es muy grande, y además esta conectada a la base con Store porcedure, y no podras hacerla correr.

    Hoy te paso la direccion de SkyDrive

    Saludos,

    Carlo Rodriguez

    sábado, 2 de abril de 2011 14:43
  • Hola Felipe,

    La aplicación que te puse en el SkyDrive esta explicada, te puse dos Usercontrols, uno que es Datos.xaml, que es dinamico y se carga en ejecución, y le otro que es DatosEstaticos.xaml que se carga por código.

    DatosEstaticos.xaml, carga perfectamente los datos de los textbox de mainwindow, y el otro UserControl "Datos" no carga ningún dato.

    la dirección de SkyDrive es :

    http://cid-a54ad28ae3735fc2.office.live.com/self.aspx/P%c3%bablica/UserControlVar.rar

    Saludos y muchas gracias por tu colaboración.

    Carlo Rodríguez

    lunes, 4 de abril de 2011 1:22
  • Hola revisa esta sección:

     Dim Usc = New Datos
        'aqui envío el valor de la variable píblica "Var"
        Usc.TbUscCodUsuario.Text = var
        'aqui envío el valor del Promoción a el Usercontrol "Datos" 
        Usc.TbUscPromoción.Text = TbPromoción.Text
        'aqui envío el valor del Promoción a el Usercontrol "Datos"
        Usc.TbUscCostoPromoción.Text = TbCosto.Text
    		GrdPrincipal.Children.Clear()
        GrdPrincipal.Children.Add(Usc)
    

    Antes estaba así:

             GrdPrincipal.Children.Add(new Datos())

    Como adivinaras no hay error, solo que siempre por más que cargues los datos, estarás creando una nueva instancía, por lo tanto no estas asociando el control que se quiere crear dinamicamente. Revisa el tema de binding.... pues cuando trabajas con una tecnología como WPF no estaría bien pasar parametros forzados, más bien establecer un binding TwoWay para que si modificas de un lado el objeto se de por enterado del cambio. Pero en fin con lo que te puse arriba podras solucionar tu problema inmediato.

    Saludos


    Custom Control Silverlight
    "Blog Ingphillip's Prog: TODO WEB
    • Propuesto como respuesta Felipe Sotelo S lunes, 4 de abril de 2011 3:35
    • Marcado como respuesta carloro lunes, 4 de abril de 2011 15:38
    lunes, 4 de abril de 2011 3:34
  • Estimado Felipe,

    MAESTRO!!!! muchisimas gracias por tu colaboración, estoy seguro que ayudará a muchos que tienen el mismo problema.

    Si no es mucha molestia tu sabes de donde puedo sacar información de Binding TwoWay?

    Nuevamente muchisimas gracias!!!!

    Saludos,

    Carlo Rodriguez

    lunes, 4 de abril de 2011 15:38
  • Si claro con gusto:

    MSDN DataBinding WPF

    Saludos


    Custom Control Silverlight
    "Blog Ingphillip's Prog: TODO WEB
    lunes, 4 de abril de 2011 15:54
  • Gracias Felipe,

    Saludos,

    Carlo Rodriguez

    lunes, 4 de abril de 2011 15:57
  • Felipe,

    En el caso de un combobox, es decir siguiendo el mismo ejemplo , en vez de un textbox de el Usercontrol, cambiamos por un Combobox:

    Usc.ComboBox.Text = TbPromoción.Text

    La línea de código sería la misma?

    Todos los combobox que tengo se llean por código y por Store Procedure, ya tienen items al momento de cargarse.

    Intente hacer el cambio que te comento y no me funciona, pero si lo hace con el Usercontrol Estático.

    Saludos,

    Carlo Rodriguez

    lunes, 4 de abril de 2011 21:44
  • ''El valor que quieres seleccionar, pero recuerda lo del Binding!!!

    cbotest.SelectedValue = "2"

     


    Custom Control Silverlight
    "Blog Ingphillip's Prog: TODO WEB
    lunes, 4 de abril de 2011 21:53
  • Hola Felipe,

    Gracias nuevamente, tengo que confesarte que soy empirico en todo este tema, hace dos años contrate a una persona para que me desarrolle una aplicación y me fallo. A partir de ahi, decidí aprender Vb.net y ahora estoy con WPF, además aprendí Sql Server.

    Después de esa explicación te darás cuenta del por que de mis preguntas. Te comento que los combobox que uso en su generalidad me sirven como valor de un parametro para la ejecución de un Store procedure de la base en Sql Server.

    Por ejemplo cuando carga el UserControl, carga también el comobobox "CbPersonal", este Combobox se conecta a la base y me carga todo el personal o usuario, pero como tengo la conexión del usuario y por defecto el codigo del mismo (la variable pública), entonces lo que quiero hacer es que se evite nuevamente seleccionar el usuario si ya lo tengo, es decir que me ponga como texto el nombre del usuario conectado, que coincide con los usuarios cargados al combobox.

    La verdad si no puedes responder a todo esto entenderé, te ocacione muchas molestias.

    Un Saludo y gracais MAESTRO!!!

    Carlo Rodriguez

    lunes, 4 de abril de 2011 23:40