




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第 5 页 共 5 页C#窗体调用Form问题是最基本的问题,因为编写WinApp程序首先接触的对象就是它,因此在论坛中对它而产生的问题也最常见。与Form相关的常见问题大致分为如下的四类问题。第一类问题:如何控制窗体的显示顺序;第二类问题:窗体之间的对象如何相互引用或操作;第三类问题:如何处理窗体唯一性问题;最后一个问题:如何合理的关闭窗体或程序。接下来先说说如何控制窗体的显示顺序。很多编程者常常会遇到这样的现象,例如,通过一个登录窗体去打开一个主窗体,然后要在主窗体中想关闭这个登录窗体。那么就有人出主意,你可以在打开主窗体的时候把登录窗体自身传进去,然后在主窗体中调用它的Hide方法来隐藏。虽说这样可以暂时达到你所要的效果,但不是最合理的解决办法。因为这样做有如下两个缺陷。第一个就是,登录窗体已经完成使命,而资源没有得到及时释放;其次就是,在窗体关闭的时候比较麻烦,需要找到登录窗口,关闭自身的同时要关闭登录窗体。遇到此问题的时候,首要的是分析窗体打开的顺序以及相互关联的条件,常见的类型无非就是主子或者先后这两种。理解好第一点后,那么要学会合理使用ShowDialogDialogResult这两个好东西,前者属于模式打开窗体,后者属于窗体的返回值。明白了这两点,就可以很方便的解决类似于登录窗体的问题,这方面的例子可以参看我的这篇文章。/knight94/archive/2006/04/06/652394.aspx具体做法如下:首先,创建Login窗口,然后添加相应的输入框和按钮,设置窗口的AcceptButton为窗体的确认按钮,而CancelButton为窗体的取消按钮。例如: this.AcceptButton = this.btnOK; this.CancelButton = this.btnCancel;定义确定按钮以及取消按钮事件,如下: private void btnOK_Click(object sender, System.EventArgs e) / Here is to use fixed username and password / You can check username and password from DB if( txtUserName.Text = Admin & txtPassword.Text = nopassword ) / Save login user info uiLogin.UserName = txtUserName.Text; uiLogin.Password = txtPassword.Text; / Set dialog result with OK this.DialogResult = DialogResult.OK; else / Wrong username or password nLoginCount+; if( nLoginCount = MAX_LOGIN_COUNT ) / Over 3 times this.DialogResult = DialogResult.Cancel; else MessageBox.Show( Invalid user name and password! ); txtUserName.Focus(); private void btnCancel_Click(object sender, System.EventArgs e) / Set dialog result with Cancel this.DialogResult = DialogResult.Cancel; 然后,在Login窗体的Closing事件中,要进行处理,如下:private void frmLogin_Closing(object sender, System.ComponentModel.CancelEventArgs e) / Check whether form is closed with dialog result if( this.DialogResult != DialogResult.Cancel & this.DialogResult != DialogResult.OK ) e.Cancel = true;除此外,Login窗体一些辅助代码如下: private int nLoginCount = 0; private const int MAX_LOGIN_COUNT = 3; private UserInfo uiLogin; public frmLogin( ref UserInfo ui ) / / Required for Windows Form Designer support / InitializeComponent(); / Set login info to class member uiLogin = ui; 调用的时候,要修改程序的Main函数,如下: / / The main entry point for the application. / STAThread static void Main() UserInfo ui = new UserInfo(); frmLogin myLogin = new frmLogin( ref ui ); if( myLogin.ShowDialog() = DialogResult.OK ) /Open your main form here MessageBox.Show( Logged in successfully! ); else MessageBox.Show( Failed to logged in! ); 而附加的UserInfo类如下: / / User info class / public class UserInfo private string strUserName; private string strPassword; public string UserName get return strUserName; set strUserName = value; public string Password get return strPassword; set strPassword = value; public UserInfo() strUserName = ; strPassword = ; 文章中修改了一个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方法,这里就不多说了。至于主窗体,首先要为这两个委托来实现对应函数,例如: / / Get textboxs text for other forms / / private string GetValue() return yourTextBox.Text; / / Set textboxs text for other forms / / 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静态成员多方便,那么对于这两点的坏处,我这里就不多说了,参看我的这篇文章你就会明白。/knight94/archive/2006/06/04/772886.aspx第三类问题,窗体的唯一性问题,这个问题我在这儿就不多说了,因为这类问题我在如下的文章已经说得很透彻了。/knight94/archive/2006/05/24/752783.aspx最后一个问题,如何合理的关闭窗体和程序。很多人关闭了窗体,发现程序进程还在,就不知道如何来操作了。大多数的问题,都是因为第一类问题而产生的连锁反应。所以我不建议使用Application.Exit来关闭程序,虽说C#写的是托管程序,内存的释放可以不用操心,但是好的编码习惯,有利于在编写复杂程序的时候能得心应手。那么如何正确的关闭一个窗体或者一个程序呢。如果不能正常关闭的原因是由于第一类问题造成的话,按照第一类的方法去修改窗体显示顺序,来达到合理的步骤。前期的正确,才能保证后期的能通过this.Close进行关闭窗体以及程序。如果
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 彭阳消防考试题库及答案
- 2025年贵州公务员考试行测真题及答案
- 2025年广西壮族自治区中央遴选真题及参考答案(b类)
- 淮安清中开学考试卷及答案
- 母婴护理师考试试卷题库及答案
- 信息技术考试真题分类及答案
- 医学生化考试试题及答案
- 广东春季高考考试卷子及答案
- 九江编制考试题库及答案
- 2025年医疗器械法规与管理考试试题及答案
- GB/T 18166-2025架空游览车类游乐设施通用技术条件
- 采光顶玻璃拆除施工方案
- 医院电梯乘坐安全培训课件
- 2025广西桂林理工大学南宁分校公开招聘教职人员控制数工作人员68人考试参考题库及答案解析
- 2025重庆市勘测院有限公司招聘6人考试参考题库及答案解析
- 水库安全生产教育培训课件
- 钢厂安全教育培训课件
- 第一部分 第七章 第41课时 气象灾害(重难课时)2026年高考地理第一轮总复习
- 红色知识竞赛试题及答案
- 2《学习成就梦想》(共21张) +公开课一等奖创新教案 统编版道德与法治七年级上册
- 西藏事业人员管理办法
评论
0/150
提交评论