首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • CSDN第一期总结之一:Form问题
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 09:59:04 楼主
    Form问题是最基本的问题,因为编写WinApp程序首先接触的对象就是它,因此在论坛中对它而产生的问题也最常见。



    与Form相关的常见问题大致分为如下的四类问题。

    第一类问题:如何控制窗体的显示顺序;

    第二类问题:窗体之间的对象如何相互引用或操作;

    第三类问题:如何处理窗体唯一性问题;

    最后一个问题:如何合理的关闭窗体或程序。




    接下来先说说如何控制窗体的显示顺序。

    很多编程者常常会遇到这样的现象,例如,通过一个登录窗体去打开一个主窗体,然后要在主窗体中想关闭这个登录窗体。那么就有人出主意,你可以在打开主窗体的时候把登录窗体自身传进去,然后在主窗体中调用它的Hide方法来隐藏。虽说这样可以暂时达到你所要的效果,但不是最合理的解决办法。因为这样做有如下两个缺陷。

    第一个就是,登录窗体已经完成使命,而资源没有得到及时释放;

    其次就是,在窗体关闭的时候比较麻烦,需要找到登录窗口,关闭自身的同时要关闭登录窗体。



    遇到此问题的时候,首要的是分析窗体打开的顺序以及相互关联的条件,常见的类型无非就是主子或者先后这两种。理解好第一点后,那么要学会合理使用ShowDialog和DialogResult这两个好东西,前者属于模式打开窗体,后者属于窗体的返回值。



    明白了这两点,就可以很方便的解决类似于登录窗体的问题,这方面的例子可以参看我的这篇文章。

    http://blog.csdn.net/knight94/archive/2006/04/06/652394.aspx

    文章中修改了一个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



    第三类问题,窗体的唯一性问题,这个问题我在这儿就不多说了,因为这类问题我在如下的文章已经说得很透彻了。

    http://blog.csdn.net/knight94/archive/2006/05/24/752783.aspx



    最后一个问题,如何合理的关闭窗体和程序。很多人关闭了窗体,发现程序进程还在,就不知道如何来操作了。大多数的问题,都是因为第一类问题而产生的连锁反应。所以我不建议使用Application.Exit来关闭程序,虽说C#写的是托管程序,内存的释放可以不用操心,但是好的编码习惯,有利于在编写复杂程序的时候能得心应手。



    那么如何正确的关闭一个窗体或者一个程序呢。



    如果不能正常关闭的原因是由于第一类问题造成的话,按照第一类的方法去修改窗体显示顺序,来达到合理的步骤。前期的正确,才能保证后期的能通过this.Close进行关闭窗体以及程序。



    如果是子窗体要关闭连锁到主窗体关闭的话,这类问题也占一大部分,那么解决此类问题可以采用第二类问题所提到委托方法。



    那么还有一些窗体关闭,程序没有正常关闭,是由于子线程没有关闭的问题,这部分留到线程汇总部分再说。



    用C#写程序不难,如何编写正确的程序才是至关重要。此时再回过头看看前面所说的四类问题的解决方法,其实不难发现这些方法并没有用到特别深的技术,都是非常普通的方法。俗话说,平凡中见真知,只要把所学的方法正确应用到编码当中,那么你处理此类问题也能游刃有余。

    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-06 10:02:111楼 得分:0
    沙发~~~

    JF~~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 22:08:522楼 得分:0
    接分~~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 22:09:483楼 得分:0
    有道理~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 22:24:204楼 得分:0
    很认真哦
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • akirya
    • 等级:
    发表于:2008-05-08 22:52:545楼 得分:0
    UP
    不错
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 22:59:516楼 得分:0
    很细致
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 23:00:417楼 得分:0
    不错。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-14 13:54:208楼 得分:0
    學習
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 11:37:069楼 得分:0
    学习中...感谢...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 11:42:3910楼 得分:0
    这种帖子应该多一些,
    论坛上重复的问题太多了~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 11:43:4411楼 得分:0
    不错。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • only_endure
    • 等级:
    发表于:2008-05-16 11:47:5412楼 得分:0
    学习.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 17:32:4813楼 得分:0
    chaihuoniu ? 

    ps: 愚翁消失好久了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • net0003
    • 等级:
    发表于:2008-05-23 16:38:0514楼 得分:0
    UP
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-26 15:48:3415楼 得分:0
    学习~~~~!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-27 13:01:4716楼 得分:0
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-28 13:40:4517楼 得分:0
    好帖,頂。
     


    ****************************
    * 多用王字的囯或原國字,少用玉字的国 *
    * 玉字的国字是由日本的汉字中拿來用的 *
    ****************************
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    世纪乐知(北京)网络技术有限公司 版权所有 京 ICP 证 020026 号
    Copyright © 2000-2007, CSDN.NET, All Rights Reserved