[VS 2008 C#] Enviar datos de una ventana a otra

Leunamal

Hola, ¿alguno de ustedes sabe como enviar información de una ventana a otra en Visual Studio 2008?

Supuestamente sería crear en ventana1 los métodos necesarios, como por ejemplo:

public String ObtenerNombre()
        {
            return txtNombre.Text;
        }

Donde txtNombre es un simple TextBox.

Al cargar ventana2 intento hacer algo como esto:

private void Form2_Load(object sender, EventArgs e)
        {
            lblTitulo.Text = "Usuario conectado: " + AplicacionPrueba.ventana1.ActiveForm.ObtenerNombre();
        }

Pero no me reconoce el método. La solución de poner el método ObtenerNombre() como static tampoco vale, porque podría haber varias instancias de ventana1.

En la web de msdn encontré algo:

http://msdn.microsoft.com/es-es/library/ms172723%28VS.80%29.aspx

Pero el ejemplo que ponen es un poco malo.

PDT: ¿Alguno de ustedes conoce algún foro de visual studio que esté bien? Me da cosa de estar poniendo aquí mensajes molestando a la gente.

Saludos

Riu

pasando los datos de un formulario a otro por parametro debe de funcionar, te explico a lo indio

Form2.dato == Form1.dato aqui metes el dato del primer formulario en el segundo, entendido?
para hacer esto debes usar un evento, me imagino sera cuando abres el segundo formulario.
ahi mete los datos del primer formulario en el segundo, yo creo que es la unica forma o quizas halla otras, pero ya no recuerdo...

Leunamal

#2 Gracias por responder, no te he comprendido mucho. Me imagino que el == te refieres a una asignación, aun así tampoco detecta los elementos de la clase ventana1. Ya preguntaré en foros especializados en visual studio. Seguro que es una chorrada.

Deathtime

Hola,

== en C# se utiliza para comparar, para asignar es sólo un =.

Tienes varias formas de hacer lo que quieres,

La más sencilla es crearle un nuevo costructor personalizado a la clase del formulario que va a recibir los parámetros, ejemplo:

public Form2(String param1, String param2)
{
  InitializeComponent();
  textbox1.text = param1;
  textbox2.text = param2;
}

Cuando lo creas desde el formulario inicial y lo muestras, le pasas los parámetros así:

Form2 form2 = new Form2("parametro1", "parametro2");
form2.ShowDialog(this);

Si son muchos parámetros, puedes hacer lo mismo pero con una lista o un array, eso ya como gustes.

Algo más sobre constructores aquí

Leunamal

#4 Gracias por responder.

Pues sí, como poder se puede hacer, pero está claro que disminuiría el acoplamiento. Si fuese algo serio, seguro que pondrian pegas por hacer algo así. Tiene la desventaja que si son tipos de datos totalmente diferentes poco podría servir un vector a no ser que se pueda hacer como en Java y definirlo como vector de Objects.

Saludos

pRAXIS

En C# existen todo y más que lo que existe en Java. Si conoces java y los genéricos los puedes usar aquí.

List<EligelaClase> lista = new List<EligelaClase>();
De todos modos una ventana es una clase, así que puedes a esa nueva clase asignarles valores a sus propiedades, en cualquier momento, siempre teniendo en cuenta la visibilidad, ya que si tienes clases en diferentes proyectos tendrás que añadir referencias a los proyectos.

Soltrac

#5 No tiene por qué. Es mas, la opción de la sobrecarga del constructor es la más elegante a mi entender.

Sobre este post y el otro insistirte en lo mismo. Todo lo q haces en java se puede hacer en .NET. Simplemente es una cuestión de conceptos.

Por último, lo del vector de objetos se puede hacer en .NET, pero en mi opinión es una opción muchísimo más fea.

Leunamal

#7 Cuando estaba cursando en su día Ingeniería del Software, no se recomendaba pasar demasiados parámetros en funciones o usar un vector para introducir los parámetros de la función (en este caso del método constructor).

Voy a seguir leyendo más sobre el tema, me parece bastante raro que no se pueda invocar a métodos de este tipo de clases. Si encuentro algo, lo pondré por aquí.

Aun así, si no es posible, la mejor solución creo que sería crear otra clase y realizar todas las operaciones con esta clase.

Saludos y gracias a todos por echarme una mano.

Soltrac

#8 Lo q estudias en ingeniería del software y el mundo real no tiene nada q ver. Lo q no puedes es dar 400 vueltas para hacer algo tan simple porque entonces te come el tiempo en los proyectos.

Por supuesto hay q respetar muchas cosas, pero para este caso, sobrecargar el constructor en mi opinión es la opción idónea.

27 días después
P

en C# para esas cosas (comunicacion entre formulario ya abiertos) puedes usar "delegados". Busca por "delegates c#" en google y veras lo que sale.
Te dejo con el 1º resultado: http://www.c-sharpcorner.com/UploadFile/Ashush/Delegates02152008155757PM/Delegates.aspx

Un saludo

Usuarios habituales