【问题标题】:Interaction between forms — How to change a control of a form from another form?表单之间的交互——如何将一个表单的控件从另一个表单更改?
【发布时间】:2016-12-10 15:49:27
【问题描述】:

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

在我的加载事件的第二种形式中,我有comboBox.DataSourceDisplayMemberValueMember 正确设置它,但是当我第一次设置 selectedValue 时没有任何反应。当我在一个表单上完成时,一切都很好

【问题讨论】:

  • 作为一个选项,您可以将值传递给新表单的构造函数。然后你可以将它存储在一个成员字段中,并在Load事件中使用它。
  • 我真的不知道该怎么做,因为我不太会使用表单?
  • 这样的问题已经被问过很多次了,例如这个帖子可能是重复的:Passing Values Between Windows Forms c# 还有这个:How to pass values between forms in c# windows application?但是我也相信当前的答案足以成为一个单独的帖子,它包含一些针对不同情况的有用选项。

标签: c# .net winforms


【解决方案1】:

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

【讨论】:

  • 我点击的是我有两个组合,只需传递两个值就可以再次节省我的时间了
  • 好的,我现在按绿色支票
  • 谢谢你为我上次的任务节省了时间和道歉你是对的我还在学习希望你理解
  • 没关系,不用担心 :) - 对了,你也可以删除你不相关或过时的 cmets。
  • 非常有用的答案。谢谢。请注意,在示例 2 中,创建Form2 的实例时不需要value
猜你喜欢
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
相关资源
最近更新 更多