C# Winform程序经验之Form问题总结
来源:互联网 发布:js offsetleft属性 编辑:程序博客网 时间:2024/06/05 04:36
转自:http://www.csharpwin.com/csharpspace/10653r6411.shtml
作者:Knight94
Form问题是最基本的问题,因为编写WinApp程序首先接触的对象就是它,因此在论坛中对它而产生的问题也最常见。
与Form相关的常见问题大致分为如下的四类问题。
第一类问题:如何控制窗体的显示顺序;
第二类问题:窗体之间的对象如何相互引用或操作;
第三类问题:如何处理窗体唯一性问题;
最后一个问题:如何合理的关闭窗体或程序。
接下来先说说如何控制窗体的显示顺序。
很多编程者常常会遇到这样的现象,例如,通过一个登录窗体去打开一个主窗体,然后要在主窗体中想关闭这个登录窗体。那么就有人出主意,你可以在打开主窗体的时候把登录窗体自身传进去,然后在主窗体中调用它的Hide方法来隐藏。虽说这样可以暂时达到你所要的效果,但不是最合理的解决办法。因为这样做有如下两个缺陷。
第一个就是,登录窗体已经完成使命,而资源没有得到及时释放;
其次就是,在窗体关闭的时候比较麻烦,需要找到登录窗口,关闭自身的同时要关闭登录窗体。
遇到此问题的时候,首要的是分析窗体打开的顺序以及相互关联的条件,常见的类型无非就是主子或者先后这两种。理解好第一点后,那么要学会合理使用ShowDialog和DialogResult这两个好东西,前者属于模式打开窗体,后者属于窗体的返回值。
明白了这两点,就可以很方便的解决类似于登录窗体的问题,这方面的例子可以参看这篇文章。
C# Winform程序经验之实现简单的Login窗口
文章中修改了一个WinApp的入口函数Main,那么并不意味着这个方法只能在这儿使用,它可以在很多方法中进行使用,基本语法类似,这里我就不多说了。
第二个要说的是窗体之间的对象如何相互引用或者操作。
常见的类似问题有:
1. 如何在子窗体访问到主窗体中的某某数据;
2. 如何在子窗体中调用主窗体中的某某方法;
3. 如何在子窗体关闭的时候去更新主窗体的某某数据;
对于如上的三个问题,完全可以由如下两种方法来完成。
1. 当数据是子窗体显示的必要条件的话,通过修改子窗体的构造函数来进行传递数据;
2. 如果是不定时的访问,则可以通过委托来实现。
对于第一点,我就不多说了,对于第二点,我用如下的例子来说明。
首先在子窗体中,需要如下:
//Define two delegate methods to get or set textbox value in main form public delegate void SetTextValue( string TextValue ); public delegate string GetTextValue( ); // In sub-form class // Handler for methods from main form private SetTextValue SetText = null; private GetTextValue GetText = null; // Call methods as follows string strValue = GetText(); SetText( strValue + DateTime.Now.ToString() );
除了如上一些操作外,还需要修改子窗体的构造函数,来接收这两个delegate方法,这里就不多说了。
至于主窗体,首先要为这两个委托来实现对应函数,例如:
/// <summary> /// Get textbox's text for other forms /// </summary> /// <returns></returns> private string GetValue() { return yourTextBox.Text; } /// <summary> /// Set textbox's text for other forms /// </summary> /// <param name="sValue"></param> private void SetValue( string sValue ) { yourTextBox.Text = sValue; }
那么调用子窗体的时候就比较简单了。
// Create subform and show it yourSubForm myForm = new yourSubForm( new SetTextValue( SetValue ), new GetTextValue( GetValue ) ); myForm.ShowDialog();
这样一个通过委托来操纵主窗体的例子就完成了。这里需要注意的一点,如果在子窗体中大量使用到主窗体的数据的话,那我建议你重新考虑窗体架构,这意味着你目前的窗体架构不合理。
有人说了,仅仅为了访问一个成员就需要劳师动众编写委托,多麻烦,直接public成员,或者使用static静态成员多方便,那么对于这两点的坏处,我这里就不多说了,参看这篇文章你就会明白。
http://blog.csdn.net/knight94/archive/2006/06/04/772886.aspx
第三类问题,窗体的唯一性问题,这个问题我在这儿就不多说了,因为这类问题在如下的文章已经说得很透彻了。
C# Winform程序以及窗体运行的唯一性汇总
最后一个问题,如何合理的关闭窗体和程序。很多人关闭了窗体,发现程序进程还在,就不知道如何来操作了。大多数的问题,都是因为第一类问题而产生的连锁反应。所以我不建议使用Application.Exit来关闭程序,虽说C#写的是托管程序,内存的释放可以不用操心,但是好的编码习惯,有利于在编写复杂程序的时候能得心应手。
那么如何正确的关闭一个窗体或者一个程序呢。
如果不能正常关闭的原因是由于第一类问题造成的话,按照第一类的方法去修改窗体显示顺序,来达到合理的步骤。前期的正确,才能保证后期的能通过this.Close进行关闭窗体以及程序。
如果是子窗体要关闭连锁到主窗体关闭的话,这类问题也占一大部分,那么解决此类问题可以采用第二类问题所提到委托方法。
那么还有一些窗体关闭,程序没有正常关闭,是由于子线程没有关闭的问题,这部分留到线程汇总部分再说。
用C#写程序不难,如何编写正确的程序才是至关重要。此时再回过头看看前面所说的四类问题的解决方法,其实不难发现这些方法并没有用到特别深的技术,都是非常普通的方法。俗话说,平凡中见真知,只要把所学的方法正确应用到编码当中,那么你处理此类问题也能游刃有余。
- C# Winform程序经验之Form问题总结
- C# winform 多form传递数据问题
- C# Winform使用问题总结
- winform c#开发经验
- 【阶段总结】关于C# WinForm程序的一些应用总结
- 关于程序崩溃的问题总结【经验】
- C#2.0,winform程序,怎么样实现点击webBrowser某个链接,显示某个form
- C#中WinForm程序退出方法技巧总结
- 【转】C#中WinForm程序退出方法技巧总结
- C#中WinForm程序退出方法技巧总结
- C#中WinForm程序退出方法技巧总结
- c# winForm 发布程序
- c# winform 关机程序
- c# winform 关机程序
- C# winform打印总结
- C# winform程序中动态菜单的问题
- C# WinForm程序中的MessageBox中的换行问题
- C# winform 程序完全退出问题的解决
- 【proguard 专题二】如何混淆jar2
- textread使用举例-matlab
- hdu Lawrence(DP-单调性优化-斜率优化)
- !@OSC本日推荐!淘宝性能采集工具-Tsar
- matlab中注释多行
- C# Winform程序经验之Form问题总结
- NOJ1093阶乘之和——n超过24不变
- VB2QTPApi_Binary.zip
- java swing高仿酷我音乐界面代码例子下载
- C学习笔记--memset注意事项
- modbus协议的介绍
- ARM存储格式之 大端小端
- SingleTon - 单例模式
- 高精度运算类bign