一尘不染

表单之间的交互-如何从另一个表单更改表单的控件?

c#

我想在第一个表单上的dataGridView中选择行以在另一个表单上用该值填充comboBox时设置comboBox.SelectedValue,

在我的加载事件我有第二种形式comboBox.DataSourceDisplayMemberValueMember正确设置它,但是当我设置了selectedValue在第一什么也没有发生。当我以一种形式进行操作时,一切都很好


阅读 310

收藏
2020-05-19

共1个答案

一尘不染

Form与其他C#类一样,Windows
Forms中的类也是一个类。表单之间的通信方式与类相同。您可以在类之间进行通信时考虑以下选项:

从第一个表格操纵第二个表格

  • 您可以将适当的参数添加到第二种形式的构造函数中。然后,您可以在创建第二种形式的实例时将值传递给构造函数。在第二种形式中,将参数存储在成员字段中,并在需要时使用它们。

  • 您可以在第二种形式中创建公共属性或方法,并在创建第二种形式的实例后设置这些属性。这样,您可以在第二种形式需要时使用它们。创建第二个表单时,此选项不限于传递值。您甚至可以在执行second的过程中使用该属性Form。这对于从中获取价值也很有用。

  • 作为另一种选择,您可以将要操纵它的控件公开,这样您就可以从其他形式访问它。建议使用一种方法来执行此操作。

从第二种形式操纵第一种形式

  • 您可以以第一种形式创建一个公共方法或属性,并将第一种形式的实例传递给第二种形式。然后在传递的实例上使用该方法/属性,就可以操纵第一种形式。

  • 您可以创建第二种形式的事件,并在创建第二种形式的实例后,以第一种形式订阅该事件,并将用于更改该形式的代码放入处理程序中。然后以第二种形式引发事件就足够了。

  • 您可以Action在第二种形式中定义类型或其他委托类型的公共属性,然后在创建第二种形式的实例后,使用自定义操作分配该属性。然后在第二种形式中,当您需要操纵第一种形式时就足以调用该动作。

  • 同样在这里,您可以使第一个窗体的控件公开,然后,如果将第一个窗体的实例传递给第二个窗体,则可以操纵该控件。建议使用其他解决方案。这就像创建公共属性或方法一样,但是在控件上执行特定任务的方法比公开整个控件更好。但是您有时可能需要此解决方案。

以下是有关上述解决方案的一些有用示例。

从第一个表格操纵第二个表格

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-使用公共​​财产或第二种形式的方法

当您需要将一些数据传递到第二个表单时,或者在创建第二个表单时甚至在创建第二个表单之后,都可以使用此示例。

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

然后在第一种形式中,足以Form2在需要时,创建之后Form2或需要设置textBox1on 值时将值传递给Form2

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

示例3-将第二种形式的控件公开

当您需要在第二个窗体上,在创建第二个窗体时甚至在创建第二个窗体之后更改控件的属性时,请使用此示例。最好使用公共属性或方法,而不要公开整个控件属性。

Form设计器中的控件中,选择控件,然后在“属性”窗口中将属性设置ModifiersPublic。还要确保该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-在第一个表单中使用第二个表单的事件

看一下这篇文章。它是关于表单和控件之间的通信,但也适用于表单之间的通信。

示例6-以第二种形式注入动作

看一下这篇文章。它是关于表单和控件之间的通信,但也适用于表单之间的通信。

示例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();
2020-05-19