Windows 窗体中的Form 是与其他 C# 类一样的类。表单之间的通信方式与类相同。您可以在类之间进行通信时考虑此选项:
从第一个表单操作第二个表单
您可以在第二种形式的构造函数中添加合适的参数。然后,您可以在创建第二种形式的实例时将值传递给构造函数。在第二种形式中,将参数存储在成员字段中,并在需要时使用它们。
您可以在第二种形式中创建公共属性或方法,并在创建第二种形式的实例后设置这些属性。这样,您可以在需要时以第二种形式使用它们。此选项不限于在创建第二个表单时传递值。您甚至可以在执行第二个Form 期间使用该属性。它对于从中获取价值也很有用。
作为另一种选择,您可以将要操作的控件公开,这样您就可以从其他表单访问它。更推荐使用方法。
从第二个表单操作第一个表单
您可以在第一种形式中创建公共方法或属性,并将第一种形式的实例传递给第二种形式。然后在传递的实例上使用该方法/属性,您可以操作第一个表单。
您可以在第二种形式中创建一个事件,并在创建第二种形式的实例后以第一种形式订阅它,并将更改表单的代码放入处理程序中。那么以第二种形式引发事件就足够了。
您可以在第二种形式中定义 Action 类型的公共属性或其他一些委托类型,然后在创建第二种形式的实例后,使用自定义操作分配该属性。然后在第二种形式中,当您需要操作第一种形式时调用该操作就足够了。
您还可以在此处将第一个表单的控件设为公开,然后如果将第一个表单的实例传递给第二个表单,您就可以操作该控件。建议使用其他解决方案。这就像创建公共属性或方法,但是在控件上执行特定任务的方法比公开整个控件更好。但有时您可能需要此解决方案。
以下是有关上述解决方案的一些有用示例。
从第一个表单操作第二个表单
Example1 - 使用第二个表单的构造函数
在创建第二个表单时,当您需要将一些数据传递给第二个表单时,请使用此示例。
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();
Example2 - 使用第二种形式的公共属性或方法
当您需要将一些数据传递给第二个表单时,在创建第二个表单时甚至在创建第二个表单之后使用此示例。
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public string SomeValue
{
get { return textBox1.Text;}
set { textBox1.Text = value;}
}
}
然后在您的第一个表单中,在您需要时将值传递给 Form2 就足够了,在创建 Form2 之后或每当您需要在 Form2 上设置 textBox1 的值时:
var f = new Form2(); //value is not needed here
f.SomeValue = "some value";
f.Show();
//...
f.SomeValue = "some other value";
示例 3 - 公开第二个表单的控件
当您需要在第二个窗体上更改控件的属性时,在创建时甚至在创建第二个窗体之后使用此示例。最好使用公共属性或方法,而不是暴露整个控件属性。
在您的Form 设计器中,选择控件并在“属性”窗口中将Modifiers 属性设置为Public。还要确保GenerateMember 属性为true。然后,您可以使用它的名称从Form 之外简单地访问此控件。
var f = new Form2();
f.textBox1= "some value";
从第二个表单操作第一个表单
示例 4 - 在第一个表单中创建公共方法或属性并将第一个表单的实例传递给第二个表单的构造函数
当您需要从第二个表单更改第一个 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 - 在第一个表单中使用第二个表单的事件
看看这个post。它是关于表单和控件之间的通信,但它也适用于表单之间的通信。
示例 6 - 在第二种形式中注入动作
看看这个post。它是关于表单和控件之间的通信,但它也适用于表单之间的通信。
示例 7 - 公开第一个表单的控件
在此解决方案中,您需要将第一个表单中的控件设为公共,如示例 3。然后如示例 4 将第一个表单的实例传递给第二个表单并将其保存在字段中并在需要时使用它。首选使用公共方法或属性。
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();