Principales respuestas
Como obtener uan variable pública desde un USERCONTROL

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
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
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
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
-
-
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
-
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 -
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
-
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 -
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
-
Ok ponlo en tu skydrive y me pasas la dirección
Custom Control Silverlight
"Blog Ingphillip's Prog: TODO WEB -
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
-
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
-
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
-
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
-
-
-
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
-
''El valor que quieres seleccionar, pero recuerda lo del Binding!!!
cbotest.SelectedValue = "2"
Custom Control Silverlight
"Blog Ingphillip's Prog: TODO WEB -
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