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

时间:2016-08-04 13:29:17

标签: c# .net winforms

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

在我的加载事件中的第二个表单上,我class InHorses e where makeHorse :: String -> e instance InHorses Horse where makeHorse s = Horse s instance HasHorses Stable where yieldInHorses e = makeHorse "Buttercup" comboBox.DataSourceDisplayMember正确设置但是当我首先设置selectedValue时没有发生任何事情。当我在一个表格上做的时候,一切都很好用

1 个答案:

答案 0 :(得分:12)

Windows窗体中的

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

从第一个表单操作第二个表单

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

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

  • 作为另一种选择,您可以将要操作它的控件公开,这样您就可以从其他表单访问它。使用方法是一种更推荐的方法。

从第二种形式操作第一个表单

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

  • 您可以使用第二种形式创建事件,并在创建第二种形式的实例后以第一种形式订阅它,并将代码更改为处理程序中的表单。然后它足以以第二种形式提出事件。

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

  • 此外,您可以将第一个表单的控件设置为公共,然后如果将第一个表单的实例传递给第二个表单,则可以操作该控件。建议使用其他解决方案。它就像创建公共属性或方法一样,但是在控件上执行特定任务的方法比暴露整个控件更好。但有时你可能需要这个解决方案。

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

从第一个表单操作第二个表单

示例1 - 使用第二个表单的构造函数

在创建第二个表单时,如果需要将某些数据传递给第二个表单,请使用此示例。

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的值时,将值传递给textBox1就足够了Form2

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