一、题目
10-4 编写一个使用非模态对话框的项目。
这道题目,我的思路是:
(1)form1(主窗体)的布局,如下:
(2)form2(非模态对话框)的布局,如下:
(3)设想:
在非模态对话框中,输入姓名、学号,点击提交后,1、“非模态对话框 ”关闭退出;2、对话框上输入的姓名、学号,传递到form1(主窗体)上,由主窗体上的标签lable显示出姓名和学号。
二、我的努力
说实话,不怕高手大侠笑话,在自学看书的过程中,怎么也想不出如何传递数据?于是,我想,先从属性传递数据开始学习。模态的传递数据,我初步完成了。这个非模态的,我不知道怎么做?希望高手大侠,不吝赐教。
我需要:
1、代码;
2、代码;
3、还是代码;
------解决思路----------------------
第二个窗口,不应该依赖 Form1,它只要处理好自己的职责就行了,不应该做“传递到form1(主窗体)上”这种事情。
因此我们可以设计如下三个属性给它
publc string 姓名
{
get { return TextBox1.Text; }
set { TextBox1.Text = value; }
}
public string 学号
{
get { return TextBox2.Text; }
set { TextBox2.Text = value; }
}
public bool 是否提交 {get;set;} //如果点击“提交按钮”,在执行 this.Close() 之前,应该设置此属性为 true
这样,将 Form2的接口设计出来,满足业务需求(当然作为一个标准的Form,Form2继承了Form的其它接口,其中的 Closed 事件就是业务中需要访问到的)。
程序的主流程由Form1实现,例如
private Form2 f;
private void Button1_Click(object sender, EventArgs e)
{
if(f == null)
{
f= new Form2();
f.Closed += f_Closed;
}
f.Show();
}
private void f_Closed(object sender, EventArgs e)
{
if( f.是否提交)
{
var a = f.姓名;
var b = f.学号;
.....
}
}
这里要理解“事件驱动程序流程”的设计原则。对于Form1来说,它捕获到 Form2(的实例窗口)关闭时,才开始处理后续业务(例如根据姓名和学号查找、验证信息并刷新自身显示)。而不是在执行 f.Show() 的代码那里去处理业务,也不是在 Form2 那里去处理本不属于 Form2 的职责的操作。