在上一篇文章中我们曾经指出指出,窗体间数据传递第一种情况的解决方法存在一个主要的缺点,就是窗体间传递的参数数目是固定的,并且类型也是固定的。这是因为,上文中修改了从命名空间System.Windows.Forms中的Form类派生而得到的Form2类的构造函数,由于构造函数中的参数和类型都是固定的,而主窗体向从窗体传递数据,就是通过构造函数中的参数来实现的,所以就造成了上面的那个缺点。其实在这种方法中还存在一个缺点,就是每一次窗体间的数据传递,就必须构建一个窗体,并且这种数据传递是一次性的。这些缺点对于窗体间传递少量数据,一般不会有太大影响,但如果要传递大量数据,并且要通过主窗体来实时向从窗体传递数据,使用这种方法就勉为其难了。
下面介绍另外一种从主窗体向从窗体传递数据的实现方法,这种方法能够完全解决上面的二个缺点,程序在主窗体中就像操作窗体中加入的组件一样,灵活的操作从窗体。
设计思路
此方法实现二个功能:
其一,主窗体能够实时地向从窗体传送数据,表现为当更改主窗体中的跟踪条(TrackBar)的数值,从窗体中定义的一个Label组件就显示出跟踪条的当前数值;
其二,从窗体能够向主窗体提出数据请求,并且能够获取主窗体中各组件显示的数据。程序表现为,当单击从窗体中的【从Form1中获取数据】按钮,程序能够把主窗体中的二个TextBox组件显示的内容传递到从窗体,并且通过从窗体中的二个TextBox组件分别显示出来。
第一个功能的实现思路是把从窗体看成是主窗体的一个实例,加入到从窗体中的组件,可以看出是从窗体中定义的一个个变量,由于从窗体中加入的组件的组件缺省定义类型是Private(私有的),所以要想访问这些组件,必须改变为Public(共有的);而第二个功能的实现思路是通过修改Form2的构造函数,构造函数实现功能是通过Form1类的实例(即为主窗体)来创建并初始化Form2类的实例(即为从窗体)。这样对于从窗体来说,主窗体则为其一个实例,从而也就可以向主窗体提出数据请求,当然要把需要访问的各组件定义类型从缺省的Private(私有的)类型修改为Public(共有的)。上述二个功能的实现方法,第二种方法比较复杂,希望各位能够结合后面的具体实现代码来理解。
第二种窗体间的数据传递情况实现步骤
1.首先创建一个Visual C#的项目文件,项目名称为【VC#中不同窗体数据传递方法02】。
2.把Visual Studio .Net的当前窗口切换到【Form1.cs(设计)】窗口,并从【工具箱】中的【Windows窗体】选项卡中拖入下列组件到【Form1.cs(设计)】窗体中,并执行相应操作:
· 二个TextBox组件,用以输入向Form2窗体传送的数据
· 二个Label组件
· 一个TrackBar组件,名称为trackBar1。
3.把Visual Studio .Net的当前窗口切换到【Form1.cs】窗口,即:Form1.cs的代码编辑窗口。并用下列代码替换替代系统产生的InitializeComponent过程。
<ccid_nobr><table cellspacing="1" cellpadding="0" width="100%" align="center" bgcolor="#eeeeee" border="0"><tbody><tr><td>
<p><ccid_code><br>private void InitializeComponent ( )<br>{<br>this.label1 = new System.Windows.Forms.Label ( ) ;<br>this.label2 = new System.Windows.Forms.Label ( ) ;<br>this.textBox1 = new System.Windows.Forms.TextBox ( ) ;<br>this.textBox2 = new System.Windows.Forms.TextBox ( ) ;<br>this.trackBar1 = new System.Windows.Forms.TrackBar ( ) ;<br>( ( System.ComponentModel.ISupportInitialize ) ( this.trackBar1 )<br>).BeginInit ( ) ;<br>this.SuspendLayout ( ) ;<br>this.label1.Location = new System.Drawing.Point ( 27 , 41 ) ;<br>this.label1.Name = "label1" ;<br>this.label1.TabIndex = 0 ;<br>this.label1.Text = "欢迎词:" ;<br>this.label2.Location = new System.Drawing.Point ( 27 , 83 ) ;<br>this.label2.Name = "label2" ;<br>this.label2.TabIndex = 1 ;<br>this.label2.Text = "提示信息:" ;<br>this.textBox1.Location = new System.Drawing.Point ( 108 , 38 ) ;<br>this.textBox1.Name = "textBox1" ;<br>this.textBox1.TabIndex = 2 ;<br>this.textBox1.Text = "" ;<br>this.textBox2.Location = new System.Drawing.Point ( 109 , 78 ) ;<br>this.textBox2.Name = "textBox2" ;<br>this.textBox2.TabIndex = 3 ;<br>this.textBox2.Text = "" ;<br>this.trackBar1.LargeChange = 1 ;<br>this.trackBar1.Location = new System.Drawing.Point ( 12 , 182 ) ;<br>this.trackBar1.Maximum = 100 ;<br>this.trackBar1.Name = "trackBar1" ;<br>this.trackBar1.Size = new System.Drawing.Size ( 272 , 42 ) ;<br>this.trackBar1.TabIndex = 1 ;<br>this.trackBar1.ValueChanged += new System.EventHandler (<br>this.trackBar1_ValueChanged ) ;<br>this.AutoScaleBaseSize = new System.Drawing.Size ( 6 , 14 ) ;<br>this.ClientSize = new System.Drawing.Size ( 292 , 273 ) ;<br>this.Controls.AddRange ( new System.Windows.Forms.Control[] {<br> this.trackBar1 ,<br> this.textBox2 ,<br> this.textBox1 ,<br> this.label2 ,<br> this.label1 } ) ;<br>this.MaximizeBox = false ;<br>this.MinimizeBox = false ;<br>this.Name = "Form1" ;<br>this.Text = "Form1" ;<br>this.Load += new System.EventHandler ( this.Form1_Load ) ;<br>( ( System.ComponentModel.ISupportInitialize ) ( this.trackBar1 )<br>).EndInit ( ) ;<br>this.ResumeLayout ( false ) ;<br>}</ccid_code><br></p>
</td></tr></tbody></table></ccid_nobr>
4.由于从窗体向主窗体提出的数据请求是二个TextBox组件的"Text"属性值,所以要修改Form1.cs文件中这二个TextBox组件的定义类型,把缺省定义为"private"类型修改为"public"类型,修改后的这二个TextBox组件在Form1.cs中的定义语句如下:
<ccid_nobr><table cellspacing="1" cellpadding="0" width="100%" align="center" bgcolor="#eeeeee" border="0"><tbody><tr><td>
<p><ccid_code><br>public System.Windows.Forms.TextBox textBox1 ;<br>public System.Windows.Forms.TextBox textBox2 ;</ccid_code><br></p>
</td></tr></tbody></table></ccid_nobr>
在上述代码后面再添加下面代码,下面代码是创建一个Form2类的实例m_Form,即从窗体:
<ccid_nobr><table cellspacing="1" cellpadding="0" width="100%" align="center" bgcolor="#eeeeee" border="0"><tbody><tr><td>
<p><ccid_code><br>private Form2 m_Form ;</ccid_code><br></p>
</td></tr></tbody></table></ccid_nobr>
5.在Form1.cs中的Main函数后,添加下列代码,下列代码的功能是实现当修改主窗体中的跟踪条数值后,从窗体中的label3组件的显示数值能够随之而变化,这样就实现主窗体实时传递数据到从窗体了:
<ccid_nobr><table cellspacing="1" cellpadding="0" width="100%" align="center" bgcolor="#eeeeee" border="0"><tbody><tr><td>
<p><ccid_code><br>private void trackBar1_ValueChanged ( object sender , System.EventArgs e )<br>{<br>m_Form.label3 .Text = trackBar1.Value.ToString ( ) ;<br>}</ccid_code><br></p>
</td></tr></tbody></table></ccid_nobr>
6.在添加完上面代码,并在其后部,再添加下列代码,下列代码的功能是使用Form2类的构造函数,并通过Form1类的实例来创建并初始化Form2类的实例。在项目文件中加入Form2类,并修改Form2类的构造函数工作将在本节的第7到11步骤中完成。
<ccid_nobr><table cellspacing="1" cellpadding="0" width="100%" align="center" bgcolor="#eeeeee" border="0"><tbody><tr><td>
<p><ccid_code><br>private void Form1_Load ( object sender , System.EventArgs e )<br>{<br>m_Form = new Form2 ( this ) ;<br>//通过主窗体来创建、初始化从窗体<br>m_Form.Show ( ) ;<br>//显示从窗体<br>}</ccid_code><br></p>
</td></tr></tbody></table>7.选择菜单【项目】|【添加Windows窗体】后,弹出【添加新项-VC#中不同窗体数据传递方法01】对话框。在此对话框中的【名称(N):】文本框中输入【Form2】后,单击【打开】按钮,则在VC#中不同窗体数据传递方法01项目中添加了一个新的窗体,名称为【Form2】。<br><br>8.把Visual Studio .Net的当前窗口切换到【Form2.cs(设计)】窗口,并从【工具箱】中的【Windows窗体】选项卡中拖入下列组件到【Form2.cs(设计)】窗体中,并执行相应操作:<br><br>· 二个TextBox组件,用以显示向主窗体请求获得的数据。<br><br>· 二个Label组件。<br><br>· 一个Button组件,名称为button1。<br><br>9.把Visual Studio .Net的当前窗口切换到【Form2.cs】窗口,即:Form2.cs的代码编辑窗口。并用下列代码替换替代系统产生的InitializeComponent过程。<br><br><ccid_nobr><table cellspacing="1" cellpadding="0" width="100%" align="center" bgcolor="#eeeeee" border="0"><tbody><tr><td>
<p><ccid_code><br>{<br>this.textBox1 = new System.Windows.Forms.TextBox ( ) ;<br>this.textBox2 = new System.Windows.Forms.TextBox ( ) ;<br>this.label2 = new System.Windows.Forms.Label ( ) ;<br>this.label1 = new System.Windows.Forms.Label ( ) ;<br>this.button1 = new System.Windows.Forms.Button ( ) ;<br>this.label3 = new System.Windows.Forms.Label ( ) ;<br>this.SuspendLayout ( ) ;<br>this.textBox1.Location = new System.Drawing.Point ( 95 , 42 ) ;<br>this.textBox1.Name = "textBox1" ;<br>this.textBox1.Size = new System.Drawing.Size ( 125 , 21 ) ;<br>this.textBox1.TabIndex = 2 ;<br>this.textBox1.Text = "" ;<br>this.textBox2.Location = new System.Drawing.Point ( 94 , 80 ) ;<br>this.textBox2.Name = "textBox2" ;<br>this.textBox2.Size = new System.Drawing.Size ( 127 , 21 ) ;<br>this.textBox2.TabIndex = 3 ;<br>this.textBox2.Text = "" ;<br>this.label2.Location = new System.Drawing.Point ( 27 , 83 ) ;<br>this.label2.Name = "label2" ;<br>this.label2.TabIndex = 5 ;<br>this.label2.Text = "提示信息:" ;<br>this.label1.Location = new System.Drawing.Point ( 38 , 45 ) ;<br>this.label1.Name = "label1" ;<br>this.label1.TabIndex = 4 ;<br>this.label1.Text = "欢迎词:" ;<br>this.button1.Location = new System.Drawing.Point ( 80 , 136 ) ;<br>this.button1.Name = "button1" ;<br>this.button1.Size = new System.Drawing.Size ( 135 , 53 ) ;<br>this.button1.TabIndex = 6 ;<br>this.button1.Text = "从Form1中获取数据" ;<br>this.button1.Click += new System.EventHandler ( this.button1_Click ) ;<br>this.label3.Location = new System.Drawing.Point ( 102 , 210 ) ;<br>this.label3.Name = "label3" ;<br>this.label3.TabIndex = 7 ;<br>this.AutoScaleBaseSize = new System.Drawing.Size ( 6 , 14 ) ;<br>this.ClientSize = new System.Drawing.Size ( 292 , 273 ) ;<br>this.Controls.AddRange ( new System.Windows.Forms.Control[] {<br> this.label3 ,<br> this.button1 ,<br> this.textBox2 ,<br> this.textBox1 ,<br> this.label2 ,<br> this.label1 } ) ;<br>this.MaximizeBox = false ;<br>this.MinimizeBox = false ;<br>this.Name = "Form2" ;<br>this.Text = "Form2" ;<br>this.ResumeLayout ( false ) ;<br>}</ccid_code><br></p>
</td></tr></tbody></table></ccid_nobr><br><br>10.由于主窗体是把其中的跟踪条的数值通过从窗体中的label组件来显示的,所以必须把Form2.cs文件中创建label3组件时定义的"private"类型修改为"public"类型,修改后的创建label3组件的代码为:<br><br><ccid_nobr><table cellspacing="1" cellpadding="0" width="100%" align="center" bgcolor="#eeeeee" border="0"><tbody><tr><td>
<p><ccid_code><br>public System.Windows.Forms.Label label3 ;</ccid_code><br></p>
</td></tr></tbody></table></ccid_nobr><br><br>由于Form2类的实例是通过Form1类的实例来初始化,所以在创建label3组件后面添加下列代码,下列代码是创建一个Form1类的实例,其作用是初始化Form2类的实例(即从窗体):<br><br><ccid_nobr><table cellspacing="1" cellpadding="0" width="100%" align="center" bgcolor="#eeeeee" border="0"><tbody><tr><td>
<p><ccid_code><br>private Form1 mF_Form ;</ccid_code><br></p>
</td></tr></tbody></table></ccid_nobr><br><br>11.修改Form2类的构造函数,具体操作如下,用下列代码替换Form2.cs中缺省的构造函数:<br><br><ccid_nobr><table cellspacing="1" cellpadding="0" width="100%" align="center" bgcolor="#eeeeee" border="0"><tbody><tr><td>
<p><ccid_code><br>public Form2 ( Form1 myForm )<br>{<br>//<br>// Windows 窗体设计器支持所必需的<br>//<br>InitializeComponent ( ) ;<br>this.mF_Form = myForm ;<br>//<br>// TODO: 在 InitializeComponent 调用后添加任何构造函数代码<br>//<br>}</ccid_code><br></p>
</td></tr></tbody></table></ccid_nobr><br><br>12.在Form2.cs中的Main函数后,添加下列代码,下列代码的功能是实现向主窗体提出数据请求,并获取主窗体的数据,当然这些数据的类型必须修改为"public"类型。<br><br><ccid_nobr><table cellspacing="1" cellpadding="0" width="100%" align="center" bgcolor="#eeeeee" border="0"><tbody><tr><td>
<p><ccid_code><br>private void button1_Click ( object sender , System.EventArgs e )<br>{<br>textBox1.Text = this.mF_Form.textBox1.Text ;<br>textBox2.Text = this.mF_Form.textBox2.Text ;<br>}</ccid_code><br></p>
</td></tr></tbody></table></ccid_nobr><br><br>13.至此,在上述步骤都成功完成,并全部保存后,Visual C#实现窗体间传递数据第二种情况的处理方法就全部完成了。此时单击快捷键【F5】就可以运行程序了,当调整Form1窗体的跟踪条数值,我们会发现Form2窗体中的label3组件显示的数值也随之变化;当在Form1窗体的二个TextBox组件中输入数据后,单击Form2窗体中的【从Form2中获取数据】按钮,则程序能够成功的从Form1中获取数据,并通过Form2中对应的TextBox组件显示出来。图01就是程序运行后的界面:<br><br><center><img height="200" src="http://www.lzhm.net/showimage.aspx?id=13" width="400"></center>
<br><br><center>图01:【VC#中不同窗体数据传递方法02】程序的运行界面</center>
<br><br><center><font color="#000099"><strong>小结</strong></font></center>
<br><br>本节介绍的这种实现窗体间数据传送的方法要比第一篇介绍的方法要难许多,其难点就在于如何修改构造函数。对于那些要从其他窗体中要访问的数据,必须设定修改为"public",否则无法实现窗体间数据传递。<br></ccid_nobr>
分享到:
相关推荐
Microsoft Visual_C#_实现窗体间数据传递
windows不同窗体件传递数据
C#窗体间传递参数
C#中两个窗体之间的参数传递,在一个窗体的文本框中输入数据,按确定后在另一个窗体中显示。
第2章 Visual C# 2010语法基础 2.1 C#语言概述 2.2 C#基础元素 2.2.1 语句 2.2.2 标识符与关键字 2.3 变量 2.3.1 变量的命名 2.3.2 变量的声明和赋值 2.4 数据类型 2.4.1 简单类型 2.4.2 结构类型 2.4.3 枚举类型 ...
c# 委托,子窗体往父窗体传值、调用方法,DEMO,完整代码,visual studio2010
C# WinForm之间调用、窗口之间相互传递参数的例子
该程序采用 Microsoft Visual Studio 2008 C#开发,主要涵盖 多窗体参数传输,access数据库访问,以及csv格式数据保存等方面内容。
Visual C# 2010程序设计教程PPT " 第1章 NET平台与Visual Studio 2010开发工具 " " .NET平台的概念及理解 " .NET平台的架构 命名空间的概念及使用 Visual Studio 2010开发工具的使用 使用Visual ...
第1章 控件操作 ---------------------------------- 实例1 如何使用错误提醒...实例147 如何在Web页间传递数据 实例148 如何创建Web Services程序 实例149 如何打包Web Services程序 实例150 如何访问Web Services程序
原书名: Microsoft Visual C# 2010 Step by Step 原出版社: Microsoft Press 作者: (英)John Sharp 译者: 周靖 丛书名: 微软技术丛书 出版社:清华大学出版社 ISBN:9787302234289 上架时间:2010-9-6 ...
《Visual C# .NET精彩编程实例集锦》配套光盘文件【全】 ...实例147 如何在web页间传递数据 实例148 如何创建webservices程序 实例149 如何打包webservices程序 实例150 如何访问webservices程序
18.2.1 窗体间的信息传递 18.2.2 AxWindowsMediaPlayer控件的相关应用 18.2.3 在列表框中动态移动选中的项 18.2.4 如何在文件夹中遍历文件 18.2.5 如何实现播放进度条 18.3 设计过程 18.3.1 磁性窗体的设置 18.3.2 ...
CLR.via.C#.(中文第3版)(自制详细书签)Part2 CLR via C#(第3版) Jeffrey Richter 著 周靖 译 出版时间:2010年09月 页数:800 介绍 享有全球盛誉的编程专家Jeffrey Richter,这位与Microsoft .NET开发团队合作...
Windows API中包含很多函数,约有1500多个,根据其类别主要分为:窗口及窗口过程、声音及音频控制、位图及位图处理、INI及注册表操作、...下面就常用的鼠标、键盘以及窗体事件来介绍一下C#开放Windows API的基本过程:
18.2.1 窗体间的信息传递 460 18.2.2 AxWindowsMediaPlayer控件的相关应用 461 18.2.3 在列表框中动态移动选中的项 463 18.2.4 如何在文件夹中遍历文件 463 18.2.5 如何实现播放进度条 464 18.3 设计过程...
Visual C#多线程参数传递浅析.txt WebBrowser控件-弹出新窗体和关闭窗口.txt WebBrowser控件的简单应用2.txt 多线程为基于.NET的应用程序实现响应迅速的用户.txt 浅述WinForm多线程编程与Control.Invoke的应用.txt ...
全书分6篇共25章,主要内容有C#开发环境的使用、C#语言基础应用、字符串处理技术、数组和集合的使用、面向对象编程技术、数据结构与算法、Windows窗体基础、特色窗体界面、窗体控制技术、MDI窗体和继承窗体、Windows...