




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
假设我们需要点击主窗体FMMain中的某一个按钮时打开子窗体FMChild并将某一个值传给子窗体FMChild,一般情况下,我们点击按钮显示子窗体FMChild的代码为:FMChild fmChild = new FMChild();fmChild.ShowDialog();fmChild.Dispose();如果我们需要将主窗体FMMain中的string strValueA的值传给FMChild,那么我们首先对strValueA进行如下处理:private string strValueA;public string StrValueAgetreturn strValueA;setstrValueA = value;使其成为主窗体FMMain的一个属性,接着修改显示子窗体的代码为以下两种的其中一种。方法一:FMChild fmChild = new FMChild();fmChild.ShowDialog(this);fmChild.Dispose();方法二:FMChild fmChild = new FMChild();FMChild.Owner = this;fmChild.ShowDialog();fmChild.Dispose();然后在修改子窗体FMChild中申明一个主窗体FMMain对象,FMMain fmMain;在需要使用主窗体FMMain的string strValueA的地方加上如下代码:fmMain = (FMMain)this.Owner;这样,就可以获得主窗体FMMain中strValueA的值了。这时,如果你需要将子窗体FMChild中的string strValueB传给主窗体FMMain,同样处理string strValueB。private string strValueB;public string StrValueBget return strValueB; set strValueB = value; 那么你在关闭子窗体代码fmChild.Dispose();后,可以写一些代码来保存或者处理FMChild的strValueB,例如:string strTmp = fmChild.StrValueB;注意,在Visual C#智能设备Pocket PC 2003设备应用程序中显示子窗体FMChild只能使用:FMChild fmChild = new FMChild();FMChild.Owner = this;fmChild.ShowDialog();fmChild.Dispose();在Visual C#智能设备Pocket PC 2003的设备应用程序中ShowDialog()没有重载。C#窗体间传值的几种方法调用窗体(父):Form1,被调用窗体(子):Form2方法1: 所有权法/Form1:/需要有一个公共的刷新方法public void Refresh_Method()/./在调用Form2时,要把Form2的所有者设为Form1Form2 f2 = new Form2() ;f2.Owner = this;f2.ShowDialog() ;/Form2:/在需要对其调用者(父)刷新时Form1 f1 ;f1 = (Form1)this.Owner;f1.Refresh_Method() ;方法2:自身传递法/Form1:/需要有一个公共的刷新方法public void Refresh_Method()/.Form2 f2 = new Form2() ;f2.ShowDialog(this) ;/Form2:private Form1 p_f1;public Form2(Form1 f1)InitializeComponent();p_f1 = f1;/刷新时p_f1.Refresh_Method() ;方法3:属性法/Form1:/需要有一个公共的刷新方法public void Refresh_Method()/./调用时Form2 f2 = new Form2() ;f2.P_F1 = this;f2.Show() ;/Form2:private Form1 p_f1;public Form1 P_F1getreturn p_f1;setp_f1 = value;/刷新时p_f1.Refresh_Method() ;方法4:委托法/声明一个委托public delegate void DisplayUpdate();/Form1:/需要有一个公共的刷新方法public void Refresh_Method()/./调用时Form2 f2 = new Form2() ;f2.ShowUpdate += new DisplayUpdate(Refresh_Method) ;f2.Show() ;/Form2:/声明事件public event DisplayUpdate ShowUpdate;/刷新时,放在需要执行刷新的事件里ShowUpdate();Form1中放一个Label1,一个Button1,Form1为主窗口,当点击Button1时,执行:Form2 f2 = new Form2();f2.ShowDialog(this);Form2中放一个TextBox1,一个Button1,当点击Button1时执行:Form1 f1 = (Form1)this.Owner;f1.Label1.Text = this.TextBox1.Text;注意:Form1中的label1要设为public用C#实现两个WinForm间的传值这个题目我曾经出给来公司面试的人,也曾经出给刚毕业的大学生,几乎是没有人会做啊。难道这个问题真的这么难么?现在我给出实现的主要源代码(开发平台为VC#2005)。实现的思路: 从Form1传递到Form2: 2个窗体即两个类,两个窗体间的数据传送,可以采用构造函数来实现。 从Form2返回到Form1,并传递数据:实例化Form2后,打f2用ShowDialog()方法,然后等待f2关闭时再回传数据到Form1。实现步骤及代码: 1:新建两个窗口: Form1,Form2; 2:打开Form2,添加一个textBox:textBox1;添加一个Button:button1;然后添加一个构造函数: /定义一个变量,用来传值。 public string returnValue ; public Form2(string txtValue) InitializeComponent(); this.textBox1.Text = txtValue; 然后在button1的单击事件中添加如下代码: private void button1_Click(object sender, EventArgs e) returnValue = this.textBox1.Text; this.Close(); 3:Form1中添加一个textBox:textBox1;添加一个Button:button1;然后在button1的单击事件中添加如下代码: private void button1_Click(object sender, EventArgs e) string txtValue = this.textBox1.Text; Form2 f2 = new Form2(txtValue); f2.ShowDialog(); this.textBox1.Text = f2.returnValue; Form1 中 (父窗口:)public class Form1 : System.Windows.Forms.Form private System.Windows.Forms.Button btnOpen; public System.Windows.Forms.TextBox txtContent; /注意是public . . STAThread static void Main() Application.Run(new Form1(); private void btnOpen_Click(object sender, System.EventArgs e) Form2 frm=new Form2(this); frm.ShowDialog(); Form2中(子窗口)public class Form2 : System.Windows.Forms.Form private System.Windows.Forms.Button button1; private System.Windows.Forms.TextBox txtValue; private Form _parentForm=null; public Form2() InitializeComponent(); public Form2(Form parentForm) InitializeComponent(); this._parentForm =parentForm; . . /更新父窗口中文本框中的值! private void button1_Click(object sender, System.EventArgs e) (Form1)_parentForm).txtContent.Text =this.txtValue .Text ; 一个小例子:将一个窗体下TextBox中的文本内容赋值给另一个窗体下的ListView中所对应的列。方法如下:将TextBox(命名为djzclx1)所在窗体Query_Djzclx .cs设置一个属性private string Varvalue;public string varvalueget return Varvalue;/返回值 添加button1,其DialogResult属性设置为OK;然后在button1的单价事件里把TextBOx的值赋给Varvalue(Varvalue=djzclx1;),这样该窗体的属性varvalue就有TExtBox的值了。在ListView所在窗体添加button1,其单击事件添加如下代码:private void CkDjzclx_Click(object sender, EventArgs e) Query_Djzclx newFrmDjzclx = new Query_Djzclx();/实例化对话框窗体 if (newFrmDjzclx.ShowDialog() = DialogResult.OK)/如果对话框窗体点击的DialogoResult属性是“OK”的按钮 ListView.Text = newFrmDjzclx.varvalue; /这句的意思是这样,就是把属性varvalue的值回传给ListView。 推荐 C# 窗体间传值方法大汇总(转) 问题点数:40分,结帖人happy09li第一种方法:创建一个类,里面声明用于存储接收的字段。传的时候存储于字段中,要用的时候,直接类名.字段名 进行调用。(这种方法传递是双向的) 第二种方法:1.在Form1里定义public string Name = * 2. 在Form2里创建Form1对象,Form1 f = new Form1(); 然后就可以通过f.Name取值了 第三种方法:用构造函数在窗体Form2中int value1; string value2; public Form2 ( int value1 , string value2 ) InitializeComponent ( ); this.value1 = value1; this.value2 = value2; 在窗体Form1中这样调用new Form2 ( 111 , 222 ).Show ( ); 这样就把111,222,这2个值传送给了Form2 d但是这样的传值是单向的第四种方法:通过窗体的公有属性值(特点:实现简单)举例“在窗体Form2中定义一个公有属性Form2Value,获取和设置textBox1的文本值public string Form2Value get return this.textBox1.Text; set this.textBox1.Text = value; 在窗体Form1中这样调用Form2 f2 = new Form2 ( ); f2.Form2Value = Ok; /给Form2的textBox1赋值Ok f2.ShowDialog ( ); 第五种方法:通过窗体的公有属性值和Owner属性(特点:实现简单,灵活)在窗体Form1中public int Form1Value = 1; Form2 f2 = new Form2 ( ); f2.ShowDialog ( this ); /把Form1作为Form2的所有者传递给Form2 在窗体Form2中/Form2的所有者是Form1 Form1 f1 = ( Form1 ) this.Owner; /取到Form1的值是1 MessageBox.Show ( f1.Form1Value .ToString ( ) ); /给Form1的Form1Value赋值222 f1.Form1Value = 222; 第六种方法:通过窗体的公有属性值和Application.OpenForms属性(感觉用的比较少)说明:Application.OpenForms属性:获取属于应用程序的打开窗体的集合。(此属性在 .NET Framework2.0版中)实现代码如下: 在窗体Form1中public int Form1Value = 1; Form2 f2 = new Form2 ( ); f2.Show ( ); 在窗体Form2中string formName = Form1; Form fr = Application.OpenForms formName ; if ( fr != null ) Form1 f1 = ( Form1 ) fr; /取到Form1的值是1 MessageBox.Show ( f1.Form1Value.ToString ( ) ); /给Form1的Form1Value赋值222 f1.Form1Value = 222; 第七种方法:通过事件在窗体Form2中定义公有属性Form2Value,获取和设置textBox1的文本值 并且还定义一个accept事件public string Form2Value get return this.textBox1.Text; set this.textBox1.Text = value; public event EventHandler accept; private void button1_Click ( object sender , EventArgs e ) if ( accept != null ) accept ( this , EventArgs.Empty ); /当窗体触发事件,传递自身引用 在窗体Form1中Form2 f2 = new Form2 ( ); f2.accept += new EventHandler ( f2_accept ); f2.Show ( ); void f2_accept ( object sender , EventArgs e ) /事件的接收者通过一个简单的类型转换得到Form2的引用 Form2 f2 = (Form2) sender; /接收到Form2的textBox1.Text this.textBox1.Text = f2.Form2Value; 这个问题被问到相当多,很多网友都知道用属性,用委托。但是具体怎么做却不清楚。我在网上看到很多文章,虽然提出的方案可行,但是实现的都不好,于是自己动手写了一个例子给大家。希望这个例子足够简单完整。我将标题设定为“最佳实践”,意味着我觉得窗体传值应该有一个统一的,标准的模式给大家套用。我认为我提供的模式比较优雅,但是更优雅的设计是采用 MVC。因为那样会大大增加例子的复杂度,不适合新手,没有给出。为了实现这个例子,你需要准备2个窗口,一个叫MainForm,上面至少需要一个richTextBox,两个工具栏按钮。另一个叫 MyDialog 的子窗口,上面有一个 textBox1,一个 Button,作为确定按钮。两个工具栏按钮分别实现两种形式的窗体调用,模态的和非模态的。模态的意思是,我们打开对话框,将值传进取,操作完成确定,主窗体再获得对话框的值。非模态的意思是,我们打开对话框,可以在不关闭窗口的情况下和主窗体交互,主窗体可以即时获得子窗体的值。类似记事本的查找替换对话框。下面是代码:主窗体:C# codeusing System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms; namespace WindowsFormsApplication1 public partial class MainForm : Form public MainForm() InitializeComponent(); private MyDialog m_dlg; private void toolStripButton1_Click(object sender, EventArgs e) MyDialog dlg = new MyDialog(richTextBox1.Text); if (dlg.ShowDialog() = DialogResult.OK) richTextBox1.Text = dlg.TextBoxValue; private void toolStripButton2_Click(object sender, EventArgs e) if (m_dlg = null) m_dlg = new MyDialog(richTextBox1.Text); m_dlg.TextBoxChanged += new EventHandler( (sender1, e1) = richTextBox1.Text = m_dlg.TextBoxValue; ); m_dlg.FormClosed += new FormClosedEventHandler( (sender2, e2) = m_dlg = null; ); m_dlg.Show(this); else m_dlg.Activate(); 子窗体C# codeusing System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using Syste
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 食用菌提取物对gutmicrobiota的影响研究-洞察阐释
- 超微粉碎在乳制品加工中的应用研究-洞察阐释
- 极地极地通信天线技术在极端环境中的应用-洞察阐释
- 量子网络的量子键构建与安全性研究-洞察阐释
- 高温超导界面相位相干调控机制-洞察阐释
- 妈妈包市场细分策略-洞察及研究
- 非invasive颅内压实时监测技术研究-洞察阐释
- 智能家居系统优化-洞察阐释
- 含瓦斯水合物煤体力学特性的非均匀性研究:试验与模拟分析
- 教育学核心知识点体系构建与教学应用研究
- DZ∕T 0207-2020 矿产地质勘查规范 硅质原料类(正式版)
- 广东省普通高中生物学业水平合格性考试真题卷含答案
- SHT 3081-2019 石油化工仪表接地设计规范
- HJ 1051-2019 土壤 石油类的测定 红外分光光度法(正式版)
- 新课标背景下的大单元教学研究:国内外大单元教学发展与演进综述
- 安全生产的责任书
- (正式版)HGT 4339-2024 机械设备用涂料
- 电网建设项目施工项目部环境保护和水土保持标准化管理手册(变电工程分册)
- JJG 105-2000转速表行业标准
- 《家政学概论》课件-第一章-现代家政概述
- GB/T 144-2024原木检验
评论
0/150
提交评论