已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Form问题是最基本的问题,因为编写WinApp程序首先接触的对象就是它,因此在论坛中对它而产生的问题也最常见。与Form相关的常见问题大致分为如下的四类问题。第一类问题:如何控制窗体的显示顺序;第二类问题:窗体之间的对象如何相互引用或操作;第三类问题:如何处理窗体唯一性问题;最后一个问题:如何合理的关闭窗体或程序。接下来先说说如何控制窗体的显示顺序。很多编程者常常会遇到这样的现象,例如,通过一个登录窗体去打开一个主窗体,然后要在主窗体中想关闭这个登录窗体。那么就有人出主意,你可以在打开主窗体的时候把登录窗体自身传进去,然后在主窗体中调用它的Hide方法来隐藏。虽说这样可以暂时达到你所要的效果,但不是最合理的解决办法。因为这样做有如下两个缺陷。第一个就是,登录窗体已经完成使命,而资源没有得到及时释放;其次就是,在窗体关闭的时候比较麻烦,需要找到登录窗口,关闭自身的同时要关闭登录窗体。遇到此问题的时候,首要的是分析窗体打开的顺序以及相互关联的条件,常见的类型无非就是主子或者先后这两种。理解好第一点后,那么要学会合理使用ShowDialog和DialogResult这两个好东西,前者属于模式打开窗体,后者属于窗体的返回值。明白了这两点,就可以很方便的解决类似于登录窗体的问题,这方面的例子可以参看我的这篇文章。/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方法,这里就不多说了。至于主窗体,首先要为这两个委托来实现对应函数,例如: / / 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进行关闭窗体以及程序。如果是子窗体要关闭连锁到主窗体关闭的话,这类问题也占一大部分,那么解决此类问题可以采用第二类问题所提到委托方法。那么还有一些窗体关闭,程序没有正常关闭,是由于子线程没有关闭的问题,这部分留到线程汇总部分再说。用C#写程序不难,如何编写正确的程序才是至关重要。此时再回过头看看前面所说的四类问题的解决方法,其实不难发现这些方法并没有用到特别深的技术,都是非常普通的方法。俗话说,平凡中见真知,只要把所学的方法正确应用到编码当中,那么你处理此类问题也能游刃有余。windows form (窗体) 之间传值小结 在windows form之间传值,我总结了有四个方法:全局变量、属性、窗体构造函数和delegate。第一个全局变量:这个最简单,只要把变量描述成static就可以了,在form2中直接引用form1的变量,代码如下:在form1中定义一个static变量public static int i= 9 ;Form2中的钮扣按钮如下:private void button1_Click(object sender, System.EventArgs e)textBox1.Text = Form1.i.ToString();第二个方法是利用属性,请详见我的博客:/tjvictor/archive/2006/06/04/772711.aspx第三个方法是用构造函数:Form1 的button按钮这样写:private void button1_Click(object sender, System.EventArgs e)Form2 temp = new Form2( 9 );temp.Show();Form2 的构造函数这样写:public Form2( int i )InitializeComponent();textBox1.Text = i.ToString();第四个方法是用delegate,代码如下:Form2中先定义一个delegatepublic delegate void returnvalue( int i );public returnvalue ReturnValue;form2 中的button按钮代码如下:private void button1_Click(object sender, System.EventArgs e)if ( ReturnValue != null )ReturnValue( 8 );Form1中的button按键如下:private void button1_Click(object sender, System.EventArgs e)Form2 temp = new Form2( );temp.ReturnValue = new temp.Form2.returnvalue( showvalue );temp.Show();private void showvalue( int i )textBox1.Text = i.ToString();点击form2的button,form1中的textbox中的值就会相应变化。在这四个方法中,第一个是双向传值,也就是说,form1和form2改变i的值,另一方也会受到影响。第二个方法可以单向也可以双向传值。第三个方法是form1-form2单向传值。第四个方法是form2-form1单向传值。以后有新的方法我再补充,还有一个就是用event,和delegate差不多,在这里就不说了。窗体间利用属性(property)来传递值时应注意的问题。 这也许是个老话题了,但是今天我在用property 时却有了新的发现。那就是如果传递的是类的话,那么是按地址(引用)来传递的。例如如下两个程序。假设有两个form,form1、form2和一个Class1.cs的类文件。form1是程序的开始窗体,通过form1 来调用form2。程序如下:Class1.cs文件的内容是public class Class1public int i;public Class1()/ TODO:i = 9;public void modify( int u )i = u;Form1中的内容是private Class1 ttt;private void Form1_Load(object sender, System.EventArgs e)ttt = new Class1();Form2 temp = new Form2();temp.Change = ttt;temp.Show();private void button1_Click(object sender, System.EventArgs e)textBox1.Text = ttt.i.ToString();private void button2_Click(object sender, System.EventArgs e)ttt.modify( 44);form2中的内容是:private Class1 change;public Class1 Changeget return change ;set change= value;private void button1_Click(object sender, System.EventArgs e)textBox1.Text = change.i.ToString();private void button2_Click(object sender, System.EventArgs e)change.modify( 98 );运行程序你会发现,改form1 中的textbox值,那么form2 中change中的i 的值也会相应的变,同样form2中change的 i 值变了,那么form1 中的 ttt 中的 i 也相应的变了。就好像两个form在使用同一个数据变量一样,为什么呢?经过思考,其实很简单,原因就在于我们在使用property传递数据时使用了同一块内存空间。在传递class类型的数据时(如上),由于我们没有new一个新的实例,而是直接赋值,所以就相当于使用了引用,把上面的赋值过程改成下面这样,private Class1 change;public Class1 Changeget return change ;set change = new Class1(); change.i = value.i ;那么两个form中的值相互之间就不再有什么关联了,也就是说,改其中一个,不会影响另外一个。这也给了我们一个启示,当我们想在form之间传值时,而且还想让值之间有一定的联系,那么就把这些值用class来包起来,再传。这样又清楚又省事。如果你传的不是类而是一般数据(int , string )等,那么这些数据在form之间是没有联系的,因为
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年保安员考试模拟试题及完整答案详解
- 2026年保险专业基础知识考试试卷及答案
- 2026年初级注册安全工程师检测卷包附完整答案【各地真题】
- 2026年度医师定期考核部试题及答案
- 2026年安全培训考试题库及答案解析
- 2026年保险公估人业务考试题(含答案)
- 2026年鼻出血现场处置业务考试试卷试题及答案
- 2026年残疾人 职业资格考试试卷及答案
- 2026年村镇银行信贷岗银行招聘考试笔试试题(含答案)
- 2026年城市消防救援业务模拟复习题(含答案)
- lng工厂消防安全培训课件
- 售后技术人员技能等级考核方案
- 铁路除颤仪(AED)采购项目方案投标文件(技术标)
- 检测仪器与仪表课件
- 借调挂职人员管理办法
- 填埋场现场管理制度
- 护理实践中的全人护理理念和实践
- 认知功能障碍患者的护理
- 超星尔雅学习通《国家安全教育(中国人民公安大学)》2025章节测试附答案
- 《德州扒鸡》课件
- 报名表的模板
评论
0/150
提交评论