在前面的二篇文章中(Visual C#实现窗体间数据传递1,2),我们已经分别探讨了主窗体向从窗体传递数据的二种实现方法,在接下来内容中,我们将介绍从从窗体向主窗体传递数据的二种常用的处理方法。
在下面这种从从窗体向主窗体传递数据的方法中,将接触到C#中二个比较重要,也是比较难以掌握的二个概念:委托(Delegate)和事件(Event)。C#中的委托类似于C和C++中的函数指针,但我们也知道,在C#并不提倡使用指针,因为这将会是的程序不受托管,而因此变得不安全。而委托和指针的主要区别就是,它是完全面相对象的,并且是类型安全的,通过委托使可以实现把方法引用封装在委托对象内。然后再将该委托对象传递给可调用所引用方法的代码。在C#中事件是当对象发生某些的事情时,类向该类的客户提供通知的一种方法。在本节介绍的这种传递数据的方法中就是通过事件来实现的。在C#中事件和委托的渊源勃深,这是因为在申明事件的之前,首先要声明该事件的委托类型。在委托类型中将定义要传递给事件的一组参数(由于本节要传递的是一个字符串,所以本节定义的委托类型中的参数类型为字符串)。在定义完委托类型后,再根据委托类型申明事件本身,在申明事件的时候要使用到关键字"event"。这样在上述工作完成后,就可以像使用类中的其他事件一样使用申明、调用事件了。
委托类型和事件其实在用Visual Studio .Net开发C#应用程序的时候,经常使用到,只不过,Visual Stduio .Net集成开发环境接管了这些工作,所以我们并没有意识到,下面这一句代码是Visual Studio .Net定义Button类的实例button1的Click事件:
其中"Click"就是申明的事件,而"EventHandler"就是委托类型。但是这些事件和委托类型都已经在.Net FrameWork SDK中定义完毕,所以,我们只要调用就可以了,但在本节介绍的从从窗体向主窗体传递数据中,这些都需要我们来定义。
本文中程序设计、调试、运行的软件环境:
(1).Windows 2000 Server版
(2).Visual Studio .Net正式版,.Net FrameWork SDK版本号3705
首先要我们要明确,主窗体其实是Form1类的实例,而从窗体是Form2类的实例。实现从从窗体向主窗体传递数据的方法的主要思路是:s首先在Form2类中定义一个委托类型SendMess,这个委托类型中的参数类型为一个字符串类型(就是通过这个类型来传送字符串数据的,当然如果你存在其他类型的数据,可以通过修改这个参数类型来完成),然后根据这个委托类型在Form2类中申明一个Send事件。这样当在Form1类中创建一个Form2类的实例的时候,同时也为这个Form2类实例定义一个Send事件。当在从窗体中单击按钮时,则在按钮的单击事件中触发Send事件,并以从窗体中要传递的字符串作为参数,同时在主窗体中的处理Send事件的代码中,通过TextBox组件的text属性来接收从窗体传递来的字符串数据,至此就实现了把从窗体中的字符串数据传递到主窗体中了。虽然实现的功能不是很负责,但涉及到的知识却是很多的,也很让人胡涂!下面是这种方法的具体的实现步骤:
1.首先创建一个Visual C#的项目文件,项目名称为【VC#中不同窗体数据传递方法03】。
2.把Visual Studio .Net的当前窗口切换到【Form1.cs(设计)】窗口,并从【工具箱】中的【Windows窗体】选项卡中拖入下列组件到【Form1.cs(设计)】窗体中,并执行相应操作:
一个TextBox组件,用以显示从从窗体传递来的字符串数据。
一个Label组件。
一个Button组件,名称为button1,并在button1被拖入窗体后,双击,则系统产生其Click事件对应的处理代码。
3.把Visual Studio .Net的当前窗口切换到【Form1.cs】窗口,即:Form1.cs的代码编辑窗口。并用下列代码替换替代系统产生的InitializeComponent过程。
请注意上述代码中粗体的代码,上述代码是定义Form2类实例myForm的Send事件,其中"SendMess"是定义的委托类型。定义"SendMess"和"Send"代码位于项目文件中的Form2.cs中。
4.在Form1.cs中的class的代码区加入下列代码,下列代码是创建一个Form2类的实例,并初始化:
5.在Form1.cs中的Main函数之后,加入下列代码,下列代码的功能是处理myForm中的Send事件,正是在Send事件中实现从从窗体向主窗体传递字符串数据:
6.用下列代码替换Form1.cs中button1组件的Click事件对应的处理代码,下列代码的作用是显示Form2类的实例myForm:
7.选择菜单【项目】|【添加Windows窗体】后,弹出【添加新项-VC#中不同窗体数据传递方法03】对话框。在此对话框中的【名称(N):】文本框中输入【Form2】后,单击【打开】按钮,则在VC#中不同窗体数据传递方法03项目中添加了一个新的窗体,名称为【Form2】。
8.把Visual Studio .Net的当前窗口切换到【Form2.cs(设计)】窗口,并从【工具箱】中的【Windows窗体】选项卡中拖入下列组件到【Form2.cs(设计)】窗体中,并执行相应操作:
一个TextBox组件,用以输入向主窗体传递的字符串数据。
一个Label组件。
一个Button组件,名称为button1,并在button1被拖入窗体后,双击之,则系统产生其Click事件对应的处理代码。
9.把Visual Studio .Net的当前窗口切换到【Form2.cs】窗口,即:Form2.cs的代码编辑窗口。并用下列代码替换替代系统产生的InitializeComponent过程。
10.在Form2.cs的class代码区添加下列代码,下列代码是在Form2类中增加一个事件类型Send,当然首先要定义一个委托类型SendMess:
11.用下列代码替换Form2.cs中button2的Click事件对应的处理代码,下列代码的功能是触发Send事件,传递字符串数据:
12.至此,在上述步骤都正确完成,并成功保存后,【VC#中不同窗体数据传递方法03】项目的全部工作就完成了。此时单击快捷键【F5】运行程序,单击主窗体中【显示Form2】按钮,则从窗体Form2就显示出来,在Form2中的【传递到主窗体的字符串】文本框中输入"Hello World!"后,单击【传递】按钮,则程序就能够把字符串"Hello World!"传递到主窗体,并通过主窗体中的【传递来的字符串】文本框显示出来,图01是【VC#中不同窗体数据传递方法03】程序的运行界面:
本节介绍的虽然是从从窗体向主窗体传递字符串类型数据。对于其他类型的数据(如:Image类型)其实现的方法也是一样的,只不过在定义委托类型时,其参数类型要定义为Image类型。同时在程序的其他对应地方做相应的修改就可以了,希望诸位能够亲自尝试一下,这对了解、掌握Delegate、Event在C#中的用法是非常有帮助。对于Visual C#初学者来说,本文介绍的这种方法是难以理解的,但本文介绍的这种方法对于精通Visual C#编程是很有帮助的,对理解Visual C#编程思想也有很大的益处,因为我们最常用的C#的开发工具Visual Studio .Net,由于其功能实在太强大,并且操作方便,在编程中替代我们做了许多烦杂的工作,这些替代工作的确给我们编程带来了许多方便、加快了编程速度,但同时也掩盖了许多相对底层的操作,使得我们对某些操作并不觉察,就是觉察到,也很难理解其中的来龙去脉缺。而本文就简单的介绍了一些功能实现方式,所以希望读者在通读完本文后,不仅能够掌握从窗体向主窗体传递数据的方法,也能够加深对这些关键理解和掌握程度。