Interacción entre formularios: ¿cómo cambiar el control de un formulario de otra forma?

Me gustaría establecer comboBox.SelectedValue cuando selecciono la fila en mi dataGridView en el primer formulario para llenar comboBox con ese valor en otro formulario,

En la segunda forma en mi evento de carga, tengo comboBox.DataSource , DisplayMember , ValueMember configurado correctamente, pero no ocurre nada cuando configuro selectedValue primero. Todo funciona bien cuando lo hago en una forma

Form en Windows Forms es una clase como otras clases de C #. La forma de comunicación entre formularios es la misma que las clases. Puede considerar estas opciones cuando se comunica entre clases:

Manipular el segundo formulario desde el primer formulario

  • Puede agregar parámetros adecuados al constructor de la segunda forma. Luego puede pasar valores al constructor al crear una instancia de la segunda forma. En la segunda forma, almacena los parámetros en los campos de miembros y úsalos cuando necesites.

  • Puede crear propiedad pública o método en el segundo formulario y establecer esas propiedades después de crear una instancia del segundo formulario. De esta manera puede usarlos cuando lo necesite en el segundo formulario. Esta opción no se limita a pasar valores al crear el segundo formulario. Incluso puede usar esa propiedad durante la ejecución del segundo Form . También es útil para obtener un valor de esto.

  • Como otra opción, puede hacer que el control que desea manipular sea público y de esta manera pueda acceder a él desde otra forma. Usar un método es una forma más recomendada de hacer esto.

Manipular el primer formulario de la segunda forma

  • Puede crear un método o propiedad pública en el primer formulario y pasar una instancia del primer formulario a la segunda forma. Luego, usando ese método / propiedad en la instancia aprobada, puede manipular el primer formulario.

  • Puede crear un evento en el segundo formulario y luego de crear una instancia de segundo formulario, suscríbase en el primer formulario y coloque el código para cambiar el formulario en el controlador. Entonces es suficiente para 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 de segunda forma, asigne la propiedad mediante una acción personalizada. Luego, en una segunda forma, es suficiente invocar la acción cuando necesitas manipular la primera forma.

  • También aquí puede hacer que un control de la primera forma sea público y luego, si pasa una instancia del primer formulario a la segunda forma, puede manipular el control. Se recomienda usar otras soluciones. Es como crear una propiedad pública o un método, pero un método que realiza tareas específicas en el control es mejor que exponer todo el control. Pero puede necesitar esta solución algunas veces.

Aquí hay algunos ejemplos útiles sobre las soluciones anteriores.

Manipular el segundo formulario desde el primer formulario

Ejemplo1 – Usando el constructor de la segunda forma

Utilice este ejemplo cuando necesite pasar algunos datos a la segunda forma, al crear la segunda forma.

 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 primera forma, es suficiente para pasar el valor a Form2 cuando crea una nueva instancia de la misma:

 var value = 2; // Or get it from grid var f = new Form2(value); f.ShowDialog(); 

Ejemplo2: uso de propiedad pública o método de segunda forma

Utilice este ejemplo cuando necesite pasar algunos datos a la segunda forma, al crear o incluso después de la creación de la segunda forma.

 public partial class Form2 : Form { public Form2() { InitializeComponent(); } public string SomeValue { get { return textBox1.Text;} set { textBox1.Text = value;} } } 

Luego, en su primera forma, es suficiente para pasar el valor a Form2 cuando lo necesite, después de crear Form2 o siempre que necesite establecer el valor de textBox1 en Form2 :

 var f = new Form2(); //value is not needed here f.SomeValue = "some value"; f.Show(); //... f.SomeValue = "some other value"; 

Ejemplo 3 – Haciendo público un control de la 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 usar propiedad o método público en lugar de exponer propiedades de control completas.

En su Form , en el diseñador, seleccione el control y en la ventana Propiedades configure la propiedad Modifiers en Public . También asegúrese de que la propiedad GenerateMember sea true . Luego puede simplemente acceder a este control usando su nombre desde fuera del Form .

 var f = new Form2(); f.textBox1= "some value"; 

Manipular el primer formulario de la segunda forma

Ejemplo 4 – Crear un Método o Propiedad público en el primer Formulario y pasar una instancia de Primer Formulario al constructor del segundo Formulario

Use este ejemplo cuando necesite cambiar el primer Form del segundo Formulario.

En su Form1 , cree una propiedad de un método que acepte algunos parámetros y ponga la lógica en él:

 public void ChangeTextBox1Text(string text) { this.textBox1.Text = text; } 

A continuación, cree un constructor en Form2 que acepte un parámetro de tipo Form1 y conserve el valor pasado en un campo de miembro y úselo 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 , debe pasarle una instancia de Form1 :

 var f = new Form2(this); f.Show(); 

Ejemplo 5 – Uso del evento del segundo formulario en el primer formulario

Echa un vistazo a esta publicación . Se trata de la comunicación entre la forma y un control, pero también es aplicable a la comunicación entre formularios.

Ejemplo 6 – Inyección y acción en el segundo formulario

Echa un vistazo a esta publicación . Se trata de la comunicación entre la forma y un 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 que un control en primer formato sea público, como en el ejemplo 3. Luego, como en el ejemplo 4, pase una instancia del primer formulario a un segundo formulario y guárdelo en un campo y úselo cuando lo necesite. Se prefiere usar un método público o propiedad.

 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();