表单之间的交互 - 如何从另一个表单更改表单的控件?
当我在第一个表单上的dataGridView中选择行以在另一个表单上用该值填充comboBox时,我想设置comboBox.SelectedValue,
在我的加载事件中的第二个表单上,我有comboBox.DataSource
, DisplayMember
, ValueMember
正确设置但是当我首先设置selectedValue时没有发生任何事情。 当我在一个表格上做的时候,一切都很好
Windows窗体中的窗体是一个类似于其他C#类的类。 表单之间的通信方式与类相同。 在类之间进行通信时,您可以考虑以下选项:
从第一张表格处理第二张表格
-
您可以将合适的参数添加到第二个表单的构造函数中。 然后,您可以在创建第二个表单的实例时将值传递给构造函数。 在第二个表单中存储成员字段中的参数,并在您需要时使用它们。
-
您可以在第二种forms中创建公共属性或方法,并在创建第二种forms的实例后设置这些属性。 这样,您可以在第二种forms中使用它们。 此选项不限于在创建第二个表单时传递值。 您甚至可以在执行第二个
Form
使用该属性。 从它获取值也很有用。 -
作为另一种选择,您可以将要操作它的控件公开,这样您就可以从其他表单访问它。 使用方法是一种更推荐的方法。
从第二种forms处理第一个表格
-
您可以在第一种forms中创建公共方法或属性,并将第一种forms的实例传递给第二种forms。 然后在传递的实例上使用该方法/属性,您可以操作第一个表单。
-
您可以创建第二种forms的事件,并在创建第二种forms的实例后以第一种forms订阅它,并将代码放在处理程序中以更改表单。 然后就足以以第二种forms提升事件了。
-
您可以在第二种forms中定义
Action
类型的公共属性或某种其他委托类型,然后在创建第二种forms的实例后,使用自定义操作分配属性。 然后在第二种forms中,当您需要操作第一个表单时,它足以调用该操作。 -
此外,您可以将第一个表单的控件设置为公共,然后如果将第一个表单的实例传递给第二个表单,则可以操作控件。 建议使用其他解决方案。 这就像创建公共属性或方法,但是在控件上执行特定任务的方法更好地暴露整个控件。 但有时你可能需要这个解决方案。
以下是有关上述解决方案的一些有用示例
从第一张表格处理第二张表格
Example1 – 使用第二个Form的构造函数
在创建第二个表单时,如果需要将某些数据传递给第二个表单,请使用此示例。
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; } }
然后在第一个表单中,当您创建一个新的实例时,它足以将值传递给Form2
:
var value = 2; // Or get it from grid var f = new Form2(value); f.ShowDialog();
示例2 – 使用第二个表单的公共属性或方法
当您需要将某些数据传递给第二种forms,创建时或创建第二种forms后,请使用此示例。
public partial class Form2 : Form { public Form2() { InitializeComponent(); } public string SomeValue { get { return textBox1.Text;} set { textBox1.Text = value;} } }
然后在第一个表单中,在创建Form2
或者需要在Form2
上设置textBox1
的值时,足以在需要时将值传递给Form2
:
var f = new Form2(); //value is not needed here f.SomeValue = "some value"; f.Show(); //... f.SomeValue = "some other value";
示例3 – 控制第二种forms公开
当您需要在创建第二个表单时创建控件或在创建第二个表单后更改控件的属性时,请使用此示例。 最好使用公共属性或方法,而不是暴露整个控件属性。
在“ Form
,在设计器中选择控件,然后在“属性”窗口中将“ Modifiers
属性设置为“ Public
。 还要确保GenerateMember
属性为true
。 然后,您可以使用Form
外部的名称来访问此控件。
var f = new Form2(); f.textBox1= "some value";
从第二种forms处理第一个表格
示例4 – 在第一个Form中创建公共方法或属性,并将First Form的实例传递给第二个Form的构造函数
当您需要从第二个表单更改第一个Form
时,请使用此示例。
在Form1
,创建一个方法的属性,该方法接受一些参数并将逻辑放入其中:
public void ChangeTextBox1Text(string text) { this.textBox1.Text = text; }
然后在Form2
创建一个构造函数,它接受Form1
类型的参数,并将传递的值保存在成员字段中,并在需要时使用它:
Form1 form1; public Form2 (Form1 f) { InitializeComponent(); form1 = f; } private void button1_Click(object sender, EventArgs e) { form1.ChangeTextBox1Text("Some Value"); }
现在,在创建Form2
您应该将Form1
的实例传递给它:
var f = new Form2(this); f.Show();
示例5 – 在第一个表单中使用第二个表单的事件
看看这篇文章 。 它是关于表单和控件之间的通信,但它也适用于表单之间的通信。
示例6 – 以第二种forms注入动作
看看这篇文章 。 它是关于表单和控件之间的通信,但它也适用于表单之间的通信。
示例7 – 控制第一种forms公开
在此解决方案中,您需要以第一种forms公开控制,例如示例3.然后像示例4将第一种forms的实例传递给第二种forms并将其保存在字段中并在需要时使用它。 首选使用公共方法或属性。
Form1 form1; public Form2 (Form1 f) { InitializeComponent(); form1 = f; } private void button1_Click(object sender, EventArgs e) { form1.textBox1.Text = "Some Value"; }
在创建Form2
您应该将Form1
的实例传递给它:
var f = new Form2(this); f.Show();