使用来自C#中主表单的子表单中的对象的信息

时间:2016-01-09 11:48:23

标签: c# forms winforms

我有一个名为Form1.cs的C#表单。通过按下按钮,出现一个名为Form2.cs的新表单,我在form2中执行某些操作。我有两种形式的变量。

我想在这两种形式之间进行沟通。

in form1:

string s=frm2.textbox1.text;`

窗口2:

if(frm1.checkbox1.checked==true)

或类似这些代码的东西。 我试过以下代码:

Form1中:

Form2 f=new Form2(this);
f.showDialog();`

窗口2:

private Form1 mainForm = null;
public Form2(Form callingForm)
{
    mainForm = callingForm as Form1;
    InitializeComponent();
}
`

这是有效的。但是我不想使用像#34这样的指针。并调用this.mainform。是否有另一种方式在函数调用之间进行通信? 谢谢。

3 个答案:

答案 0 :(得分:0)

您只能传递Form2所需的信息,并且只公开Form1需要的信息

Form1中

string valueOfForm2 = null;
using Form2 f = new Form2(this.checkbox1.Checked)
{
    f.ShowDialog();
    valueOfForm2 = f.ReturnValue;
}

然后在Form1中使用valueOfForm2

窗体2

bool _IsForm1ValueChecked;

//By this property text will be exposed to outside of Form
public string ReturnValue { get { return this.textbox1.Text;} }

public Form2(bool isForm1ValueChecked)
{
    _IsForm1ValueChecked = isForm1ValueChecked;
}

_IsForm1ValueChecked将在构造函数中设置 - 然后在Form2中将其用于您的目的

答案 1 :(得分:0)

您可以采取以下几种不同的方法,使表格2无需了解表格1,这将使表格2可重复使用:

代表

您可以在第二个表单上声明委托函数,然后将委托方法从第一个表单传递给第二个表单,这样第二个表单就可以回调第一个表单。

这种方法意味着您的第二种形式不再对您的第一份表格有任何直接了解。它还意味着您可以从任何表单重用第二个表单,只需传入具有正确签名的委托。示例如下:

Form1中:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 f=new Form2(UpdateTextBox);
        f.ShowDialog();
    }

    private void UpdateTextBox(string newText)
    {
        label1.Text = newText;
    }
}

表格2:

public partial class Form2 : Form
{
    public delegate void ChoiceMadeOnForm2Delegate(string choice);

    private ChoiceMadeOnForm2Delegate _choiceDelegate;

    public Form2(ChoiceMadeOnForm2Delegate choiceDelegate)
    {
        InitializeComponent();

        _choiceDelegate = choiceDelegate;
    }

    private void saveButton_Click(object sender, EventArgs e)
    {
        _choiceDelegate(textBox1.Text);
        Close();
    }
}

在此示例中,委托方法只有一个参数,但是如果要将一系列值传递回Form 1,则委托方法声明可以包含更多参数,或者参数可以是类。

如果您还想从表单1设置Form2的初始值,您当然可以将它们添加为表单2的构造函数参数,并在新建表单2时将其传递。

在您的示例中,表单2显示为对话框,但如果您不想以模态方式显示表单2,您甚至可以在表单1上有一个委托给您传递给表单2,这样表单就可以在两个方向上进行通信

使用数据绑定和共享类

另一种方法是使用数据绑定,从而将两个表单绑定到同一个对象,并在打开表单2时将该对象从表单1中的表单2传递给表单2.当任一表单更改对象时,这些更改将是同时和立即反映在两种形式上。

要做到这一点,您需要阅读一个名为数据绑定的概念,并在数据类上实现INotifyPropertyChanged接口。然后,将两个表单上的相关控件绑定到该类。 INotifyPropertyChanged上的文档可以是found here

答案 2 :(得分:0)

我认为对于这些东西,我正在使用属性。 我不喜欢从一个表单访问另一个表单的控件。 如果我需要来自一个表单的信息,我更喜欢通过属性访问这个其他表单。 除此之外,您还可以定义一个接口,该接口将包含表单之间通信所需的所有属性/方法。使用界面将更加清晰,您将获得所需的信息,并且不会因其他无关信息而过载。

例如:

Interface IForm2
{
   // your properties
   string PersonName {get;}     // Just an example

   // your methods
}

class Form1: Form
{
     private IForm2 _form2;

     void Foo()
     {
         var pname = _form2.PersonName;   // Just an example
     }
}

class Form2: Form, IForm2
{
    string PersonName 
    {
         get 
         {
              return personNameTextBox.Text;
         }
    }
}