Form 问题是最基本的问题,因为编写 WinForm 程序首先接触的对象就是它,因此在论坛中 对它而产生的问题也最常见。 与 Form 相关的常见问题大致分为如下的四类问题。 第一类问题:如何控制窗体的显示顺序; 第二类问题:窗体之间的对象如何相互引用或操作; 第三类问题:如何处理窗体唯一性问题; 最后一个问题:如何合理的关闭窗体或程序。 如何控制窗体的显示顺序 接下来先说说如何控制窗体的显示顺序。 很多编程者常常会遇到这样的现象,例如,通过一个登录窗体去打开一个主窗体,然后要在 主窗体中想关闭这个登录窗体。 那么就有人出主意, 你可以在打开主窗体的时候把登录窗体 自身传进去,然后在主窗体中调用它的 Hide 方法来隐藏。虽说这样可以暂时达到你所要的 效果,但不是最合理的解决办法。因为这样做有如下两个缺陷: 第一个就是,登录窗体已经完成使命,而资源没有得到及时释放; 其次就是,在窗体关闭的时候比较麻烦,需要找到登录窗口,关闭自身的同时要关闭登录窗 体。 遇到此问题的时候, 首要的是分析窗体打开的顺序以及相互关联的条件, 常见的类型无非就 是主子或者先后这两种。 理解好第一点后, 那么要学会合理使用 ShowDialog 和 DialogResult 这两个好东西,前者属于模式打开窗体,后者属于窗体的返回值。 明白了这两点, 就可以很方便的解决类似于登录窗体的问题, 这方面的例子可以参看我的这 篇文章。 blog.csdn.net/knight94/archive/2006/04/06/652394.aspx 文章中修改了一个 WinForm 的入口函数 Main,那么并不意味着这个方法只能在这儿使用, 它可以在很多方法中进行使用,基本语法类似,这里我就不多说了。 窗体之间的对象如何相互引用或操作 第二个要说的是窗体之间的对象如何相互引用或者操作。 常见的类似问题有: 1. 如何在子窗体访问到主窗体中的某某数据; 2. 如何在子窗体中调用主窗体中的某某方法; 3. 如何在子窗体关闭的时候去更新主窗体的某某数据。 对于如上的三个问题,完全可以由如下两种方法来完成: 1. 当数据是子窗体显示的必要条件的话,通过修改子窗体的构造函数来进行传递数据; 2. 如果是不定时的访问,则可以通过委托来实现。 对于第一点,我就不多说了,对于第二点,我用如下的例子来说明。
首先在子窗体中,需要如下: //在主窗体中定义两个 delegate 分别用于设置或者获取主窗体中文本框的值 public delegate void SetTextValue( string TextValue ); public delegate string GetTextValue( ); // 在子窗体中 // Handler for methods from main form private SetTextValue SetText = null; private GetTextValue Ge
tText = null; // 通过如下所示来调用方法 string strValue = GetText(); SetText( strValue + DateTime.Now.ToString() ); 除了如上一些操作外,还需要修改子窗体的构造函数,来接收这两个 delegate 方法,这里就 不多说了。 至于主窗体,首先要为这两个委托来实现对应函数,例如: ///
/// 从其它窗体获取文本值 /// ///
private string GetValue() { return yourTextBox.Text; } ///
///设置其它窗体的文本值 /// ///
private void SetValue( string sValue ) { yourTextBox.Text = sValue; }
那么调用子窗体的时候就比较简单了。 //创建子窗体并且显示 yourSubForm myForm = new yourSubForm( new SetTextValue( SetValue ), new GetTextValue( GetValue ) ); myForm.ShowDialog();
这样一个通过委托来操纵主窗体的例子就完成了。 这里需要注意的一点, 如果在子窗体中大 量使用到主窗体的数据的话, 那我建议你重新考虑窗体架构, 这意味着你目前的窗体架构不 合理。 有人说了,仅仅为了访问一个成员就需要劳师动众编写委托,多麻烦,直接 public 成员,或 者使用 static 静态成员多方