现在有这样一个需求:一个主窗口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组件传递数据,而构造函数一般来说,是对所描述的类进行实例化的,这样它就干了不该干的事
第四种方案,可行,但还是没必要,不符合编程规范