Foros del Web » Programación para mayores de 30 ;) » .NET »

Pasar variable de WindowsForm a Control

Estas en el tema de Pasar variable de WindowsForm a Control en el foro de .NET en Foros del Web. Hola, soy un programador amateur en .NET y estoy investigando respecto a la inclusión de controles en mis formularios para facilitar la programación de mis ...
  #1 (permalink)  
Antiguo 22/02/2012, 07:10
 
Fecha de Ingreso: febrero-2012
Mensajes: 21
Antigüedad: 12 años, 5 meses
Puntos: 0
Pasar variable de WindowsForm a Control

Hola,


soy un programador amateur en .NET y estoy investigando respecto a la
inclusión de controles en mis formularios para facilitar la programación de mis aplicaciones. Lo que necesitaría es poder pasar el valor de una variable (un string, por ejemplo) que se lee en el WindowsForm y de algún modo, cuando incluya mi control personalizado en ese formulario y genere algún evento (click de un botón) poder manejar esa variable y hacer lo que tenga que hacer con ella (mostrarla en un MessageBox, por ejemplo).

Por tanto, mi pregunta es: ¿Como paso el valor de dicha variable a mi
control personalizado para poder manejarla desde el control? Utilizo Visual Studio 2010.

Gracias de antemano.

Un saludo,
Alex
  #2 (permalink)  
Antiguo 22/02/2012, 08:51
Avatar de alan_69niupi  
Fecha de Ingreso: junio-2011
Mensajes: 200
Antigüedad: 13 años, 1 mes
Puntos: 17
Respuesta: Pasar variable de WindowsForm a Control

si a lo que te refieres es preservar la variable a lo largo de la aplicacion declarara como
Public Shared Variable

despues de que la uses o le des un valor la envias a un metodo y ahi es done la puedes mostrar en un msjbox.
  #3 (permalink)  
Antiguo 22/02/2012, 09:53
 
Fecha de Ingreso: febrero-2012
Mensajes: 21
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Pasar variable de WindowsForm a Control

Cita:
Iniciado por alan_69niupi Ver Mensaje
despues de que la uses o le des un valor la envias a un metodo y ahi es done la puedes mostrar en un msjbox.
Define, "enviar a un método" por favor. Gracias!
  #4 (permalink)  
Antiguo 22/02/2012, 10:51
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 2 meses
Puntos: 344
Respuesta: Pasar variable de WindowsForm a Control

Puedes crear una propiedad en el control personalizado que crees y le asignas el valor de lo que recojas del formulario.

Código vb:
Ver original
  1. Public Class ControlMio
  2.     Inherits System.Windows.Forms.UserControl
  3. Public Property ValorAGuardar As String  
  4. End Class

Y al instanciar el control le pasas el valor que desees

Código vb:
Ver original
  1. Dim control = new ControlMio
  2.  
  3. ' Supongo que txtbox es un control TextBox del formulario
  4. ' Le asignas al control el valor del textbox
  5. control.ValorAGuardar = txtbox.Text
  6.  
  7. control
  8.  
  9. control
  #5 (permalink)  
Antiguo 22/02/2012, 11:11
Avatar de alan_69niupi  
Fecha de Ingreso: junio-2011
Mensajes: 200
Antigüedad: 13 años, 1 mes
Puntos: 17
Respuesta: Pasar variable de WindowsForm a Control

bien, por ejemplo

digamos que de esta manera obtienes el valor

nombre=textbox1.Text
'aqui es donde envias y llamas al metodo, el compilador al ajecutar esta linea de codigo
'ejecutara todos los procesos que contenga el metodo
Metodo(nombre)
'esto lo puedes hacer en cualquier control

'este metodo va fuera, es independiente

Sub Metodo(ByVal Nom as String)
'al declarar ByVal Nom as String quiere decir que para ejecutar este metodo
'debemos llamarlo enviandole una variable de tipo String
MsgBox("Nombre "+Nom)
End Sub


saludos
  #6 (permalink)  
Antiguo 22/02/2012, 17:37
 
Fecha de Ingreso: febrero-2012
Mensajes: 21
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Pasar variable de WindowsForm a Control

Sería del revés, quiero leer la variable desde el control para que cada vez que lo utilice se le pase el valor al control y automáticamente cuando interactúe sobre el control, que se ejecute utilizando esa variable que viene del programa principal (WindowsForm). Programo en C#.

Gracias a todos de nuevo!
  #7 (permalink)  
Antiguo 24/02/2012, 06:55
 
Fecha de Ingreso: febrero-2012
Mensajes: 21
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Pasar variable de WindowsForm a Control

Gracias a todos por las respuestas. Investigando un poco ya he conseguido solucionar el problema de las variables. He definido una variable pública en el control y desde el formulario modifico su valor. Era bastante más simple de lo esperado.

Ahora viene lo grueso. Desde dichos controles quiero llamar a métodos que tenia definidos en el formulario principal. Aunque allí esten declarados como públicos, evidentemente no puedo acceder a ellos desde el control.

¿Como puedo hacer una llamada a un método implementado en un formulario desde un control?
  #8 (permalink)  
Antiguo 24/02/2012, 07:16
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 2 meses
Puntos: 344
Respuesta: Pasar variable de WindowsForm a Control

Buenas,

Lo que has hecho es lo que propuse yo en mi contestación. Es importante que uses una propiedad pública para acceder a esa variable (o campo), y esta variable debería estar declarada como privada. Esto es en lo que se basa la orientación a objetos.

Para tu segunda pregunta, tienes que crear eventos en el control y cuando insertes el control en el formulario asignarle los métodos que quieres que se ejecutan cuando lances esos eventos.

En este enlace te explica como hacerlo:

http://msdn.microsoft.com/es-es/libr...(v=vs.80).aspx

Saludos.
  #9 (permalink)  
Antiguo 27/02/2012, 06:42
 
Fecha de Ingreso: febrero-2012
Mensajes: 21
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Pasar variable de WindowsForm a Control

Me he puesto manos a la obra y he encontrado algún problemilla(excepción al acceder al evento), imagino facil de resolver.

El control está definido de la siguiente manera:

public partial class Formato : UserControl
{
public string jobFileFullPath;

public delegate void CambiarDeFormatoEventHandler(object sender, EventArgs e);
public event CambiarDeFormatoEventHandler FormatoCargado;

public Formato()
{
InitializeComponent();
}

private void buttonAbrirFormato_Click(object sender, EventArgs e)
{

try
{
FormatoCargado(this, e);
}

catch (Exception excep) {
MessageBox.Show(excep.Message);
}
}

}
}


Aqui declaro el delegado y el evento y hago una llamada a dicho evento. Después he creado un formulario en el mismo proyecto donde si todo va bien, despues de hacer click en el boton del control, se debería lanzar el evento "FormatoCargado" y mostrarse un mensaje en dicho formulario:


public partial class PruebaControl : Form
{

Formato fm = new Formato();


public PruebaControl()
{
InitializeComponent();
fm.FormatoCargado +=new Formato.CambiarDeFormatoEventHandler(fm_FormatoCar gado);
}

void fm_FormatoCargado(object sender, EventArgs e)
{
MessageBox.Show("Evento lanzado!!");
}

}
}



GRACIAS
  #10 (permalink)  
Antiguo 27/02/2012, 08:39
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 2 meses
Puntos: 344
Respuesta: Pasar variable de WindowsForm a Control

Lo mejor es crear un método que lance el evento, comprobando antes que el evento tenga algún delegado asociado (se hace viendo si es igual a null):

Código C#:
Ver original
  1. public partial class Formato : UserControl
  2. {
  3. public string jobFileFullPath;
  4.  
  5. public delegate void CambiarDeFormatoEventHandler(object sender, EventArgs e);
  6. public event CambiarDeFormatoEventHandler FormatoCargado;
  7.  
  8. public Formato()
  9. {
  10. InitializeComponent();
  11. }
  12.  
  13. private void buttonAbrirFormato_Click(object sender, EventArgs e)
  14. {
  15.  OnFormatoCargado(e);
  16. }
  17.  
  18. private OnFormatoCargado(EventArgs e){
  19.  
  20. if (FormatoCargado != null){
  21.  FormatoCargado(this, e);
  22. }
  23. }
  24. }
  25.  
  26.  
  27. Aqui declaro el delegado y el evento y hago una llamada a dicho evento. Después he creado un formulario en el mismo proyecto donde si todo va bien, despues de hacer click en el boton del control, se debería lanzar el evento "FormatoCargado" y mostrarse un mensaje en dicho formulario:
  28.  
  29.  
  30. public partial class PruebaControl : Form
  31. {
  32.  
  33. Formato fm = new Formato();
  34.  
  35.  
  36. public PruebaControl()
  37. {
  38. InitializeComponent();
  39. fm.FormatoCargado +=new Formato.CambiarDeFormatoEventHandler(fm_FormatoCargado);
  40. }
  41.  
  42. void fm_FormatoCargado(object sender, EventArgs e)
  43. {
  44. MessageBox.Show("Evento lanzado!!");
  45. }
  46.  
  47. }
  #11 (permalink)  
Antiguo 28/02/2012, 03:10
 
Fecha de Ingreso: febrero-2012
Mensajes: 21
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Pasar variable de WindowsForm a Control

Cita:
Iniciado por alexg88 Ver Mensaje

Lo mejor es crear un método que lance el evento, comprobando antes que el evento tenga algún delegado asociado (se hace viendo si es igual a null):

[/HIGHLIGHT]
Con esto lo que sucede es que dicho método se ejecuta, se intenta lanzar el evento y como es null (igual que antes) no se lanza. He leído varios ejemplos y visto algún tutorial y no parece que esté haciendo nada extraño :-s.
  #12 (permalink)  
Antiguo 28/02/2012, 03:31
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 2 meses
Puntos: 344
Respuesta: Pasar variable de WindowsForm a Control

Pues si es null es porque no estarás asignando el evento correctamente, no hay otra explicación.

Saludos.
  #13 (permalink)  
Antiguo 28/02/2012, 03:42
 
Fecha de Ingreso: febrero-2012
Mensajes: 21
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Pasar variable de WindowsForm a Control

Yo creo que si que está bien asignado. Me da la sensación de que tiene algo que ver con el uso de un control en un form.
  #14 (permalink)  
Antiguo 28/02/2012, 03:48
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 2 meses
Puntos: 344
Respuesta: Pasar variable de WindowsForm a Control

Tendrás que depurar el código para ver donde está el problema, es lo único que puedo decirte sin tener todo el código disponible.

Saludos.
  #15 (permalink)  
Antiguo 28/02/2012, 04:48
 
Fecha de Ingreso: febrero-2012
Mensajes: 21
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Pasar variable de WindowsForm a Control

He creado dos pequeños proyectos donde el problema sucede de la misma manera:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using ControlesPrueba;

namespace FormPrueba
{
public partial class Form1 : Form
{

ControlDeUsuario cu = new ControlDeUsuario();

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
cu.Control += new ControlDeUsuario.HandlerControl(MetodoDelEvento);
}

void MetodoDelEvento(object sender, EventArgs e)
{
textBox1.Text = "SI";
}



}
}





using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ControlesPrueba
{
public partial class ControlDeUsuario : UserControl
{

public delegate void HandlerControl(object sender, EventArgs e);
public event HandlerControl Control;

public ControlDeUsuario()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
if (Control != null)
Control(this, e);
}

}
}
  #16 (permalink)  
Antiguo 28/02/2012, 04:55
 
Fecha de Ingreso: febrero-2012
Mensajes: 21
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Pasar variable de WindowsForm a Control

Cita:
Iniciado por alexg88 Ver Mensaje
Tendrás que depurar el código para ver donde está el problema, es lo único que puedo decirte sin tener todo el código disponible.

Saludos.

Si quieres, puedo pasarte los dos proyectos por email y los pruebas directamente. Mil gracias por tu atención una vez más.
  #17 (permalink)  
Antiguo 28/02/2012, 13:10
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 2 meses
Puntos: 344
Respuesta: Pasar variable de WindowsForm a Control

Yo he probado y funciona perfectamente. Lo único raro es como insertas el control de usuario dentro del formulario, porque en tu código instancias un control de usuario pero no lo añades al formulario.

Si lo haces con el diseñador de windows Forms, tendrás una instancia al control de usuario, que será sobre el que tengas que poner el evento.

Te dejo mi código:

Código C#:
Ver original
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9.  
  10. namespace PruebaControles
  11. {
  12.     public partial class Form1 : Form
  13.     {
  14.         public Form1()
  15.         {
  16.             InitializeComponent();
  17.         }
  18.  
  19.         private void Form1_Load(object sender, EventArgs e)
  20.         {
  21.             controlDeUsuario1.Control += new ControlDeUsuario.HandlerControl(MetodoDelEvento);
  22.         }
  23.  
  24.         void MetodoDelEvento(object sender, EventArgs e)
  25.         {
  26.             textBox1.Text = "SI";
  27.         }
  28.  
  29.     }
  30. }

Código C#:
Ver original
  1. namespace PruebaControles
  2. {
  3.     partial class Form1
  4.     {
  5.         /// <summary>
  6.         /// Variable del diseñador requerida.
  7.         /// </summary>
  8.         private System.ComponentModel.IContainer components = null;
  9.  
  10.         /// <summary>
  11.         /// Limpiar los recursos que se estén utilizando.
  12.         /// </summary>
  13.         /// <param name="disposing">true si los recursos administrados se deben eliminar; false en caso contrario, false.</param>
  14.         protected override void Dispose(bool disposing)
  15.         {
  16.             if (disposing && (components != null))
  17.             {
  18.                 components.Dispose();
  19.             }
  20.             base.Dispose(disposing);
  21.         }
  22.  
  23.         #region Código generado por el Diseñador de Windows Forms
  24.  
  25.         /// <summary>
  26.         /// Método necesario para admitir el Diseñador. No se puede modificar
  27.         /// el contenido del método con el editor de código.
  28.         /// </summary>
  29.         private void InitializeComponent()
  30.         {
  31.             this.controlDeUsuario1 = new PruebaControles.ControlDeUsuario();
  32.             this.textBox1 = new System.Windows.Forms.TextBox();
  33.             this.SuspendLayout();
  34.             //
  35.             // controlDeUsuario1
  36.             //
  37.             this.controlDeUsuario1.Location = new System.Drawing.Point(58, 52);
  38.             this.controlDeUsuario1.Name = "controlDeUsuario1";
  39.             this.controlDeUsuario1.Size = new System.Drawing.Size(150, 150);
  40.             this.controlDeUsuario1.TabIndex = 0;
  41.             //
  42.             // textBox1
  43.             //
  44.             this.textBox1.Location = new System.Drawing.Point(97, 83);
  45.             this.textBox1.Name = "textBox1";
  46.             this.textBox1.Size = new System.Drawing.Size(100, 20);
  47.             this.textBox1.TabIndex = 1;
  48.             //
  49.             // Form1
  50.             //
  51.             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
  52.             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
  53.             this.ClientSize = new System.Drawing.Size(284, 262);
  54.             this.Controls.Add(this.textBox1);
  55.             this.Controls.Add(this.controlDeUsuario1);
  56.             this.Name = "Form1";
  57.             this.Text = "Form1";
  58.             this.Load += new System.EventHandler(this.Form1_Load);
  59.             this.ResumeLayout(false);
  60.             this.PerformLayout();
  61.  
  62.         }
  63.  
  64.         #endregion
  65.  
  66.         private ControlDeUsuario controlDeUsuario1;
  67.         private System.Windows.Forms.TextBox textBox1;
  68.     }
  69. }

Código C#:
Ver original
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Data;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9.  
  10. namespace PruebaControles
  11. {
  12.     public partial class ControlDeUsuario : UserControl
  13.     {
  14.         public delegate void HandlerControl(object sender, EventArgs e);
  15.         public event HandlerControl Control;
  16.  
  17.         public ControlDeUsuario()
  18.         {
  19.             InitializeComponent();
  20.         }
  21.  
  22.         private void button1_Click(object sender, EventArgs e)
  23.         {
  24.             if (Control != null)
  25.                 Control(this, e);
  26.  
  27.         }
  28.     }
  29. }

Código C#:
Ver original
  1. namespace PruebaControles
  2. {
  3.     partial class ControlDeUsuario
  4.     {
  5.         /// <summary>
  6.         /// Variable del diseñador requerida.
  7.         /// </summary>
  8.         private System.ComponentModel.IContainer components = null;
  9.  
  10.         /// <summary>
  11.         /// Limpiar los recursos que se estén utilizando.
  12.         /// </summary>
  13.         /// <param name="disposing">true si los recursos administrados se deben eliminar; false en caso contrario, false.</param>
  14.         protected override void Dispose(bool disposing)
  15.         {
  16.             if (disposing && (components != null))
  17.             {
  18.                 components.Dispose();
  19.             }
  20.             base.Dispose(disposing);
  21.         }
  22.  
  23.         #region Código generado por el Diseñador de componentes
  24.  
  25.         /// <summary>
  26.         /// Método necesario para admitir el Diseñador. No se puede modificar
  27.         /// el contenido del método con el editor de código.
  28.         /// </summary>
  29.         private void InitializeComponent()
  30.         {
  31.             this.button1 = new System.Windows.Forms.Button();
  32.             this.SuspendLayout();
  33.             //
  34.             // button1
  35.             //
  36.             this.button1.Location = new System.Drawing.Point(40, 96);
  37.             this.button1.Name = "button1";
  38.             this.button1.Size = new System.Drawing.Size(75, 23);
  39.             this.button1.TabIndex = 0;
  40.             this.button1.Text = "button1";
  41.             this.button1.UseVisualStyleBackColor = true;
  42.             this.button1.Click += new System.EventHandler(this.button1_Click);
  43.             //
  44.             // ControlDeUsuario
  45.             //
  46.             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
  47.             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
  48.             this.Controls.Add(this.button1);
  49.             this.Name = "ControlDeUsuario";
  50.             this.ResumeLayout(false);
  51.  
  52.         }
  53.  
  54.         #endregion
  55.  
  56.         private System.Windows.Forms.Button button1;
  57.     }
  58. }
  #18 (permalink)  
Antiguo 28/02/2012, 16:44
 
Fecha de Ingreso: febrero-2012
Mensajes: 21
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Pasar variable de WindowsForm a Control

Cita:
Iniciado por alexg88 Ver Mensaje
Yo he probado y funciona perfectamente. Lo único raro es como insertas el control de usuario dentro del formulario, porque en tu código instancias un control de usuario pero no lo añades al formulario.

Si lo haces con el diseñador de windows Forms, tendrás una instancia al control de usuario, que será sobre el que tengas que poner el evento.

No entiendo nada. He visto algún caso más parecido a este donde no se sabe muy bien el porque de que no funcione.

El control esta agregado directamente al formulario desde el toolbox, donde tengo una librería de controles definida. Desde ahí, arrastrar y pegar. ¿Tu has agregado el control de una manera distinta?
  #19 (permalink)  
Antiguo 28/02/2012, 16:58
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 2 meses
Puntos: 344
Respuesta: Pasar variable de WindowsForm a Control

No, lo he hecho igual que tu, arrastrando el control desde el toolbox.

Si lo has hecho como tú dices, el código que has puesto no es válido, me refiero a esta línea:

Código:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using ControlesPrueba;

namespace FormPrueba
{
public partial class Form1 : Form
{

ControlDeUsuario cu = new ControlDeUsuario();

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
cu.Control += new ControlDeUsuario.HandlerControl(MetodoDelEvento);
}

void MetodoDelEvento(object sender, EventArgs e)
{
textBox1.Text = "SI";
}



}
}
A lo que me refiero es que cuando pones el control desde el toolbox, el diseñador te crea ya la instancia al control y lo añade al formulario, no tienes que crear tu otra instancia. No sé si lo harás así o sólo lo has puesto para simplificar. Si es este último caso, pon el código completo del ejemplo que hayas hecho para verlo en detalle.

Saludos.
  #20 (permalink)  
Antiguo 29/02/2012, 02:38
 
Fecha de Ingreso: febrero-2012
Mensajes: 21
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Pasar variable de WindowsForm a Control

Ya está todo claro. Estoy canelo...tenías toda la razón del mundo. Estaba añadiendo el evento a un nuevo control y no al control real que se ha generado al arrastrar y pegar. Espero que le sirva a más gente también.

Muchísimas gracias por tu ayuda.


Un saludo!!
  #21 (permalink)  
Antiguo 06/03/2012, 03:22
 
Fecha de Ingreso: febrero-2012
Mensajes: 21
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Pasar variable de WindowsForm a Control

Vuelvo a tener problemas, ahora con la inclusión de un objeto de librería externa en el control. Cuando trato de compilar me sale el siguiente mensaje:


"Mixed mode assembly is built against version 'v2.0.50727' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information."


He estado buscando información al respecto y al parecer es un error de compilación del framework debido a que dicha librería probablemente esta compilada con una versión anterior. He probado con una solución ofrecida por varios usuarios de la red, pero sin éxito. Se trata de crear un App.config con el siguiente código:


<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>
</configuration>



La cuestión es que tan si quiera he operado con dicho objeto. Solo con la definición de un objeto de dicha librería ya me da este error.

¿Alguna solución/propuesta?


GRACIAS.

Etiquetas: control, net, visual, windowsform, variables, aplicaciones
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:49.