现在有这样一个需求:一个主窗口Form1和一个对话框窗口DialogForm。主窗口通过一个菜单项调出对话框窗口。对话框窗口有个保存按钮,点击保存按钮后,对话框关闭,告知MainForm这个消息,并在其上显示修改后的信息

 

方案一:使用事件

我们先定义EventArgs的派生类txtContentEventArgs,以便可以从事件中传递数据

public class txtContentEventArgs:EventArgs

{

    private string _myContent;

   public string myContent

   {

        get{return _myContent;}

   }

   public txtContentEventArgs(string txtContent)

   {     _myContent = txtContent;    }

}

同时,要在类内声明事件,首先必须声明该事件的委托类型:

public delegate void txtContentEventHandler(object sender, txtContentEventArgs e);

 

然后在DialogForm中声明如下事件和函数:

public event txtContentEventHandler getContent;

 

private void btnOK_Click(object sender, EventArgs e)

{

   if(getContent!=null)

   {

      txtContentEventArgs E = new txtContentEventArgs(txtMessage.Text);

      getContent(this, E);

   }

}

 

主窗口Form1中通过订阅事件来刷新数据:

public Form1()

{

      InitializeComponent();

      DialogForm _frmChild = new DialogForm();

      _frmChild.getContent+=new txtContentEventHandler(_frmChild_getContent);

}

private void _frmChild_getContent(object sender, txtContentEventArgs e)

{

      lblMessage.Visible = true;

      lblMessage.Text = e.myContent;

}

 

方案二:使用Button.DialogResult 属性

我们先在DialogForm窗体代码中添加属性strContent

public string strContent

{

         get{return txtMessage.Text;}

}

并将OK按钮的DialogResult属性设为ok

 

然后在Form1的打开对话框的方法中写

DialogForm formChild=new DialogForm();

if(formChild.ShowDialog()==DialogResult.OK)

 {

lblMessage.Visible=true;

lblMessage.Text=formChild.strContent;

}

 

 

方案三:用DialogForm的构造器直接传参数

首先重写DialogForm的构造函数

private Form1 _myForm;

public DialogForm(Form1 myForm)

 {

       InitializeComponent();

       _myForm=myForm;               

//样在Form1中声明DialogForm的时候就把Form1的实例传递过来

}

Form1中,在需用到DialogForm的地方声明如下:

 DialogForm myChildForm = new DialogForm(this);

此时,只要把Form1中相关数据定义成public形式,就可以再DialogForm中对主窗口进行操作

private void btnOK_Click(object sender, EventArgs e)

{

this._myForm.lblMessage.Text = txtContent.Text;          

}

另外也可以不用带参数的构造器,直接按如下所述:

Form1中,DialogForm myChildForm = new DialogForm();

                            myChildForm.owner=this;

 

 

方案四:静态变量

在公共类中定义一静态变量(相当于全局变量),直接类名.变量即可访问与设置

 

 

 总结:

上面四种方案,第一种最优,事件所产生的松耦合非常有意义;

第二种方案,DialogResult依赖于ModalDialog ,如果程序显示是Modaless,那么DialogResult不产生任何值,从而UI的改变导致了代码的改变

第三种方案,用构造函数对UI组件传递数据,而构造函数一般来说,是对所描述的类进行实例化的,这样它就干了不该干的事

第四种方案,可行,但还是没必要,不符合编程规范

 

 

posted on 2009-04-14 08:19  Pavel Yu  阅读(606)  评论(0编辑  收藏  举报