窗体间传值和窗体间互操作open in new window

今天遇到一个非常棘手的问题:子窗体在关闭时传递一个对象给父窗体。窗体关闭时会发生数据验证,当数据不正确时,窗体不可关闭。

由于编写之初总在思考一个完美的办法,导致代码总无法通过,最后,不得不使用最笨拙但有效的办法:公共静态变量。

这个静态变量不论是子窗体还是父窗体持有,都没有关系。一般而言,父窗体持有它。

现在,在子窗体中可以修改公共数据了。

但是,修改时,还必须修改父窗体的状态,我采用的一个委托,将委托作为参数传递个子窗体,在子窗体中,要更改父窗体的地方,调用这个委托。

对这种普遍的问题,有什么通用的比较好的解决方案呢?

http://tech.ccidnet.com/pub/article/c294_a34599_p1.html

这篇文章提供了一种方案,但仍然笨拙,不太好。

比如:当子窗体不一定有时,一定有时,据条件存在时,情况并不一样。

期待好的办法……

posted on 2004-08-16 17:11 海天一鸥 阅读(888) 评论(9)



2004-08-16 17:22 Threading

用委托和事件机制应该是最好的解决方法了吧,或许父窗体可以用 Singleton 模式,不过没试过。

2004-08-16 18:33 浪漫十一狼

用静态变量不好
在子窗体中定义一个public的变量,在关闭子窗体前给它赋值,然后父窗体调用
例如:
子窗体:
public string str;
str="aaa";

父窗体:
childWin win=new childWin();
win.ShowModel();
MessageBox.Show(win.str);

2004-08-16 18:42 Threading

公开一个变量的方法非常不好,实在没办法了再用的。

2004-08-16 20:09 jason

我也遇到过,可后来想不出好的办法。折腾了一下,最后我选择如下方法:

private Form _frmChangePassword;
private void ShowUI_ModifyPWD(object sender, System.EventArgs e)
{
    if (_frmChangePassword != null)
    {
        _frmChangePassword.Dispose();
    }
    //初始化窗体 
    _frmChangePassword = new frmChangePassword();
    _frmChangePassword.MdiParent = this;
    _frmChangePassword.Show();
}

2004-08-17 09:02 海天一鸥

to:jason
你的办法是把子窗体作为父窗体成员。

to:浪漫十一狼
子窗体关闭时,子窗体持有的变量已经消失了。
除非你使用公共静态变量。

2004-08-17 09:13 吕震宇

如果数据简单,我使用Form.Tag,比较简单。

以前在VFP中看到过一种对象回传复杂数据的方法:

首先定义一个类,比如叫:cResult,用来存放子窗体返回值。然后在子窗体中添加一个带cResult类型参数的构造函数,在父窗体中编写代码:

cResult r = new cResult();
ChildForm cf = new ChildForm(r);
cf.ShowModel();

这样,父窗体与子窗体都有cResult的一个存根,实现相互的数据传递。

如果需要修改父窗体状态的话,可以增加cResult复杂度,加入事件功能,父窗体订阅这些事件,而子窗体负责触发事件。于是父窗体与子窗体便不会出现相互依赖的问题,它们共同依赖于cResult。这种模型相对稳定(因为cResult一旦确定下来便不容易发生变化)。

这就是所谓的“依赖倒置”原则。

2004-08-17 10:57 吕震宇

写了篇文章《窗体间传递复杂数据(附源码)》,欢迎访问。

2004-08-17 18:05 浪漫十一狼

to 海天一鸥 :
子窗体关闭就消失了吗?看来一定你一定没做过
to 吕震宇 :
你的方法也是定义一个公共事件,和定义一个公共变量本质上一样的

2004-08-18 00:37 海天一鸥

to: 浪漫十一狼 :
例如:
子窗体:
public string str;
str="aaa";

父窗体:
childWin win=new childWin();
win.ShowModel();
MessageBox.Show(win.str);

我查看了MSDN文档,没有看到ShowModel方法啊。 是自定义方法吗?

窗体调用Dispose()释放后,再访问窗体变量,这是不允许的。

吕震宇 的方法是一种解决办法。 委托是解偶合的一种手段。

2007-03-27 10:00 ┅☆伈隨風飛

你的哪个传值 不可以啊!
我试了 不知道怎么了
可能是我 方法不对,怎么的
写详细点 OK

2007-03-27 10:01 ┅☆伈隨風飛

呵呵 哈哈

2008-11-01 16:58 C#狂人

我测试过了,“浪漫十一狼”的方法是正确的,不过
win.ShowModel();的确是不对的,应该是win.ShowDialog();这样就没有问题了。

Contributors: FHL