本来第一次学Winform开发没有想到用多个窗体,但是发现不用多窗体有些功能的确不好实现,所以还是得使用多窗体才可以,多窗体面临的一个问题就是数据交互,比如我主界面是一个题库,子界面是一个题目,那么我不将哪个题目哪个路径告诉子题目,子题目显然不知道显示哪一个。
如何实现窗体间的交互呢,大概有三种方案:
(1)修改子窗体的构造函数
这个我认为是最简单粗暴的,也是我使用的一种,原理很简单就是直接修改构造函数即可,这里举个例子:
在Form1.cs中,定义代码如下:
album_SendTo_ANS = A;
node_SendTo_ANS = thisNode;
Form Form2 = new Form(this);
Form2.ShowDialog();
那么在Form2.cs中,可以如下得到构造函数:
public Form2(Form1 form1)
{
InitializeComponent();
album_SendTo_ANS = form1.get_album_SendTo_ANS();
node_SendTo_ANS = form1.get_node_SendTo_ANS();
}
当然这里我把两个传递的参数设置为了form1的私有成员,因此这里还是使用封装的get来得到。这里其实在Form Form2 = new Form(this);可以根据自己的需求进行参数的设置,我因为这里参数个数可能会变动,因此选择直接传窗体这种比较图简单的方法,一般还是传参数。
(2)给子窗体添加从属属性
这里要让子窗体归属于父窗体,因此可以设定子窗体的Owner属性,Owner属性的值是父窗体的引用。当子窗体属于父窗体所有时有以下特性:
①子窗体随着父窗体最小化和关闭。例如,如果子窗体Form2归父窗体Form1所有,则关闭或最小化Form1时,也会关闭或最小化Form2。
②子窗体不显示在父窗体后面。可以将附属窗体用于查找和替换窗口之类的窗口,当选定所有者窗体时,这些窗口不应消失。若要确定某父窗体拥有的窗体,可以使用OwnedForms属性。
有以下两种方法:
Form2 form2 = new Form2();
form2.Owner = this;
form2.ShowDialog();
Form2 form2 = new Form2();
form2.ShowDialog(this);
当从属关系确定,就可以有以下方法修改参数:
Form1 form1 = (Form1)this.Owner;
this.Data1 = form1.Data2;
(3)通过委托的方式
相对以上两种方法来说,这种方法可能较复杂一些,但基本思路是一样的,需要修改的地方如下:
①在Form2.cs中添加委托函数定义:public delegate void SendFun(string str);
②在Form2.cs中添加委托示例:public event SendFun SendToParent;
③在Form2.cs中添加一个按钮,并添加其事件如下:
private void button1_Click(object sender, EventArgs e)
{
if (Send != null)
{
Send(this.textBox1.Text);
}
}
④在Form1.cs中添加方法RecvInfo()方法如下:
private void RecvInfo (string str)
{
textBox1.Text = str;
}
⑤在Form1.Designer.cs中的InitializeComponent()方法中添加委托实例定义:
this.myForm.Send += new Example3_Form2. SendFun (RecvInfo);
即可实现Form间的通信,这种方案我目前还没有实现过,也是在其他博客上看到的,因此记录一下。