Interacción entre formularios — ¿Cómo cambiar un control de un formulario de otro formulario?
Me gustaría configurar comboBox.SelectedValue cuando selecciono la fila en mi dataGridView en el primer formulario para completar comboBox con ese valor en otro formulario.
En el segundo formulario de mi evento de carga comboBox.DataSource
, lo configuré correctamente DisplayMember
, ValueMember
pero no sucede nada cuando configuro el valor seleccionado en primer lugar. Todo funciona muy bien cuando lo hago en un solo formulario.
Form
en Windows Forms es una clase como otras clases de C#. La forma de comunicarse entre formularios es la misma que la de las clases. Puede considerar estas opciones al comunicarse entre clases:
Manipular el segundo formulario desde el primer formulario
Puede agregar parámetros adecuados al constructor del segundo formulario. Luego puede pasar valores al constructor al crear una instancia del segundo formulario. En el segundo formulario, almacene los parámetros en los campos de miembros y utilícelos cuando los necesite.
Puede crear una propiedad o método público en el segundo formulario y establecer esas propiedades después de crear una instancia del segundo formulario. De esta manera podrás usarlos cuando los necesites en el segundo formulario. Esta opción no se limita a pasar valores al crear el segundo formulario. Incluso puedes usar esa propiedad durante la ejecución de second
Form
. También es útil para obtener un valor de ello.Como otra opción puedes hacer público el control que deseas manipular y así podrás acceder a él desde otra forma. Usar un método es una forma más recomendada de hacerlo.
Manipular el primer formulario desde el segundo formulario
Puede crear un método o propiedad pública en el primer formulario y pasar una instancia del primer formulario al segundo formulario. Luego, utilizando ese método/propiedad en la instancia pasada, puede manipular el primer formulario.
Puede crear un evento en el segundo formulario y después de crear una instancia del segundo formulario, suscribirse al primer formulario y colocar el código para cambiar el formulario en el controlador. Entonces basta con plantear el evento en segunda forma.
Puede definir una propiedad pública de tipo
Action
o algún otro tipo de delegado en el segundo formulario y luego, después de crear una instancia del segundo formulario, asignar la propiedad mediante una acción personalizada. Luego, en la segunda forma, basta con invocar la acción cuando necesites manipular la primera forma.También aquí puede hacer que un control del primer formulario sea público y luego, si pasa una instancia del primer formulario al segundo formulario, puede manipular el control. Se recomienda utilizar otras soluciones. Es como crear una propiedad o método público, pero un método que realiza una tarea específica en el control es mejor que exponer todo el control. Pero es posible que necesites esta solución algunas veces.
A continuación se muestran algunos ejemplos útiles sobre las soluciones anteriores.
Manipular el segundo formulario desde el primer formulario
Ejemplo 1: uso del constructor del segundo formulario
Utilice este ejemplo cuando necesite pasar algunos datos al segundo formulario, al crear el segundo formulario.
public partial class Form2 : Form
{
int selectedValue;
public Form2(int value)
{
InitializeComponent();
selectedValue = value;
}
private void Form2_Load(object sender, EventArgs e)
{
//Load data
this.comboBox1.DataSource = new MyDbContext().Categories.ToList();
this.comboBox1.DisplayMember = "Name";
this.comboBox1.ValueMember = "Id";
this.comboBox1.SelectedValue = selectedValue;
}
}
Luego, en su primer formulario, es suficiente pasarle el valor Form2
cuando crea una nueva instancia del mismo:
var value = 2; // Or get it from grid
var f = new Form2(value);
f.ShowDialog();
Ejemplo 2: uso de propiedad pública o método de segunda forma
Utilice este ejemplo cuando necesite pasar algunos datos al segundo formulario, al crear o incluso después de la creación del segundo formulario.
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public string SomeValue
{
get { return textBox1.Text;}
set { textBox1.Text = value;}
}
}
Luego, en su primer formulario, es suficiente pasar el valor Form2
cuando lo necesite, después de crear Form2
o cuando necesite establecer el valor de textBox1
on Form2
:
var f = new Form2(); //value is not needed here
f.SomeValue = "some value";
f.Show();
//...
f.SomeValue = "some other value";
Ejemplo 3 - Hacer público un Control de Segunda Forma
Utilice este ejemplo cuando necesite cambiar una propiedad de un control en el segundo formulario, al crear o incluso después de la creación del segundo formulario. Es mejor utilizar propiedad o método público en lugar de exponer propiedades de control completas.
En su Form
diseñador, seleccione el control y en la ventana Propiedades establezca la Modifiers
propiedad en Public
. También asegúrese de que la GenerateMember
propiedad sea true
. Luego, simplemente puede acceder a este control usando su nombre desde fuera del archivo Form
.
var f = new Form2();
f.textBox1= "some value";
Manipular el primer formulario desde el segundo formulario
Ejemplo 4: crear un método o propiedad pública en el primer formulario y pasar una instancia del primer formulario al constructor del segundo formulario
Utilice este ejemplo cuando necesite cambiar el primero Form
desde el segundo formulario.
En su Form1
, cree una propiedad de un método que acepte algunos parámetros y coloque la lógica en ella:
public void ChangeTextBox1Text(string text)
{
this.textBox1.Text = text;
}
Luego cree un constructor en Form2
el que acepte un parámetro de tipo Form1
y mantenga el valor pasado en un campo miembro y utilícelo cuando lo necesite:
Form1 form1;
public Form2 (Form1 f)
{
InitializeComponent();
form1 = f;
}
private void button1_Click(object sender, EventArgs e)
{
form1.ChangeTextBox1Text("Some Value");
}
Ahora, al crear Form2
, debes pasarle una instancia de Form1
:
var f = new Form2(this);
f.Show();
Ejemplo 5: uso del evento del segundo formulario en el primer formulario
Mira esta publicación . Se trata de comunicación entre formulario y control, pero también es aplicable a la comunicación entre formularios.
Ejemplo 6: Inyectar una acción en segunda forma
Mira esta publicación . Se trata de comunicación entre formulario y control, pero también es aplicable a la comunicación entre formularios.
Ejemplo 7: Hacer público un Control de primera forma
En esta solución, debe hacer público un control en el primer formulario, como en el ejemplo 3. Luego, como en el ejemplo 4, pase una instancia del primer formulario al segundo formulario y manténgala en un campo y úsela cuando lo necesite. Se prefiere utilizar un método o propiedad pública.
Form1 form1;
public Form2 (Form1 f)
{
InitializeComponent();
form1 = f;
}
private void button1_Click(object sender, EventArgs e)
{
form1.textBox1.Text = "Some Value";
}
al crear Form2
debes pasarle una instancia de Form1
:
var f = new Form2(this);
f.Show();