当前位置: 代码迷 >> C# >> 初学者急求:非模态对话框怎么传回数据
  详细解决方案

初学者急求:非模态对话框怎么传回数据

热度:122   发布时间:2016-05-05 04:48:30.0
菜鸟急求:非模态对话框如何传回数据?
一、题目
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 的职责的操作。
  相关解决方案