版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
创建一个Winform窗体应用程序项目,然后添加一个Form2窗体。
H解决方案WindowsForms跨窗体传值大全”(1个项目)
/厘]WindowsForms跨窗体传值大全
»AProperties
>引用
口App.config
»国Form1.cs
»国Form2.cs
»c*Program.cs
在Forml和Form2中各添加一个textBox和button:
单击Forml中的buttonl,弹出Form2,然后要做的就是在Forml中的textBoxl和Form2中的textBox2中传值。
为了方便起见,将Forml称作父窗体,将Form2称作子窗体。
相对来说,将父窗体的值传到子窗体较为容易实现。下面分别进行说明。
一、父窗体传值给子窗体。
方法1:通过Form类构造方法的重载传参。
Forml类中代码:
1usingSystem;2usingSystem.Windows.Forms;34namespaceWindowsForms跨窗体传值大全5{6
publicpartialclassForml:Form7{8publicForml()9{10
InitializeComponent();11}1213privatevoidbuttonl_Click(objectsender,EventArgs
e)14{15Form2f2=newForm2(textBoxl.Text);16
f2.ShowDialog();17)18}19}
Fo「m2类中代码:
1usingSystem;2usingSystem.Windows.Forms;34namespaceWindowsForms跨窗体传值大全5{6
publicpartialclassForm2:Form7{8publicForm2()9{10
InitializeComponent();11}1213publicForm2(stringstr)14{15
InitializeComponent();16textBox2.Text=str;//这句必须放在InitializeComponent()
否则会引起''空引用异常”17}1819}20)
*Form□X
2016buttonl
■9Form2□x
2016button2
方法2:通过外部可访问的中间变量传参。
先看一串无法实现目的的代码。
Forml中:
1usingSystem;2usingSystem.Windows.Forms;34namespaceWindowsForms跨窗体传值大全5{6
publicpartialclassForml:Form7{8publicForml()9{10
InitializeComponent();11)1213publicstringstr;//public类型的实例字段1415
privatevoidbuttonl_Click(objectsender,EventArgse)16{17Form2f2=new
Form2();18str=textBoxl.Text;//ftA,这句不能放在£2.ShowDialog();的后面,否则会先执行
textBox2.Text=f1.str;再执行str=textBoxl.Text;19f2.ShowDialog();20}
21}22}
Form2中:
1usingSystem;2usingSystem.Windows.Forms;34namespaceWindowsForms跨窗体传值大全5{6
publicpartialclassForm2:Form7{8publicForm2()9{10
InitializeComponent();11}1213privatevoidForm2_Load(objectsender,EventArgs
e)14{15Formlfl=newForml();16textBox2.Text=f1.str;17}18
19}20)
结果值没有传过来:
■BForml□X
2016button1
■S1Form2□x
button2
这是因为:Formlfl=newForml。;相当于新建了一,个对象,这个新对象的str初始值是null(只有该对象的buttonl
被click的时候才会改变str的值)。textBox2.Text=fl.str;其实就是将null赋给了textBox2.Text。
调试如图:
privatevoidForm2_Load(objectsender,EventArgse)
(
验理工fl=newForml。;
textBox2.Text=fl.str;
.fl.strhull
static变量可以认为是全局变量,static变量被所有对象所共有,也可以被所有对象所改变,将相关代码修改如下即可:
publicstaticstringstr;//public类型的实例字段
privatevoidForm2_Load(objectsender,EventArgse)
textBox2.Text=Forml.str;
)
它有一种变式:
Forml中:
1usingSystem;2usingSystem.Windows.Forms;34namespaceWindowsForms跨窗体传值大全5{6
publicpartialclassForml:Form7{8publicForml()9{10
InitializeComponent();11}1213privatevoidbuttonl_Click(objectsender,EventArgs
e)14{15Form2f2=newForm2();16f2.str=textBoxl.Text;17
f2.ShowDialog();1819}20}21}
Form2中:
1usingSystem;2usingSystem.Windows.Forms;34namespaceWindowsForms跨窗体传值大全5{6
publicpartialclassForm2:Form7{8publicForm2()9{10
InitializeComponent();11)1213publicstringstr;//这里str是在Form2类中定义的,并且
不需要static关键字1415privatevoidForm2_Load(objectsender,EventArgse)16{17
textBox2.Text=str;18}1920}21}
分析:f2.str=textBoxLText;将textBoxl的值赋给f2.str,由于f2.ShowDialog();跳出来的刚好是这个对象,因此
这个对象的str值不为空。最终通过textBox2,Text=str;将值传过去了。跟上一个例子的不同之处是:str声明的位置
不一样,一个是在Forml类中,一个是在Form2类中。
一、子窗体传值给父窗体。
方法工:通过Owner设置窗口归属来传值。
①通过Controls
Forml中:
1usingSystem;2usingSystem.Windows.Forms;34namespaceWindowsForms跨窗体传值大全5{6
publicpartialclassForml:Form7{8publicForml()9{10
InitializeComponent();11}1213privatevoidbuttonl_Click(objectsender,EventArgs
e)14{15Form2f2=newForm2();16£2.ShowDialog("this);//这个this必不
可少(将窗体显示为具有指定所有者:窗体£2的所有者是Forml类当前的对象)17}18}19}
Form2中:
1usingSystem;2usingSystem.Windows.Forms;34namespaceWindowsForms跨窗体传值大全5{6
publicpartialclassForm2:Form7{8publicForm2()9{10
InitializeComponent();11}1213privatevoidbutton2_Click(objectsender,EventArgs
e)14{15Formlfl=(Forml)this.Owner;//将本窗体的拥有者强制设为Forml类的实例£116
fl.Controls["textBoxln].Text=textBox2.Text;17}1819}20}
fiForml□XiflForml
2016buttonl900
■9Form2□x■Form2
900|button2900
②通过在控件所在类中增加改变控件属性的方法
或者通过在Forml中添加一个ChangeText方法也行:
publicvoidChangeText(stringstr)
(
textBoxl.Text=str;
}
Form2中代码相应改变为:
privatevoidbutton2_Click(objectsender,EventArgse)
{
Formlfl=(Forml)this.Own㊀r;//将本窗体的拥有者强制设为Forml类的实例fl
fl.ChangeText(textBox2.Text);
)
注意:如果不用Owner,仅仅想用下面的代码实现,是没可能的。
//Form工中:usingSystem;usingSystem.Windows.Forms;
namespaceWindowsForms跨窗体传值大全
publicpartialclassForml:Form
publicForml()
InitializeComponent();
privatevoidbuttonl_Click(objectsender,EventArgse)
Form2f2=newForm2();
f2.ShowDialog();
)
publicvoidChangeText(stringstr)
textBoxl.Text=str;
}
)
//Form2中:usingSystem;usingSystem.Windows.Forms;
namespaceWindowsForms跨窗体传值大全
publicpartialclassForm2:Form
publicForm2()
InitializeComponent();
)
privatevoidbutton2_Click(objectsender,EventArgse)
Formlfl=newForml();
fl.ChangeText(textBox2.Text);
//这种代码无法实现目的
③通过将外界不可访问的控件、、属性〃封装成可以访问的属性。
Forml中:
1usingSystem;2usingSystem.Windows.Forms;34namespaceWindowsForms跨窗体传值大全5{6
publicpartialclassForml:Form7{8publicForml()9{10
InitializeComponent();11}1213privatevoidbuttonl_Click(objectsender,EventArgs
e)14{15Form2f2=newForm2();16f2.ShowDialog(this);17}1819
publicstringTextBoxlValue20{21set{textBoxl.Text=value;}22get
{returntextBoxl.Text;}23}2425}26}
Form2中:
1usingSystem;2usingSystem.Windows.Forms;34namespaceWindowsForms跨窗体传值大全5{6
publicpartialclassForm2:Form7{8publicForm2()9{10
InitializeComponent();11}1213privatevoidbutton2_Click(objectsender,EventArgs
e)14{15Formlfl=(Forml)this.Owner;16fl.TextBoxlValue=
textBox2.Text;17}1819}20}
方法2:通过提供外部可访问的属性和DialogResult的状态来传值(这个例子同时实现了父传子、子传父)。
Forml中:
1usingSystem;2usingSystem.Windows.Forms;34namespaceWindowsForms跨窗体传值大全5{6
publicpartialclassForml:Form7{8publicForml()9{10
InitializeComponent();11}1213privatevoidbuttonl_Click(objectsender,EventArgs
e)14{15Form2f2=newForm2();16f2.TextBox2Value=
t㊀xtBoxl.Text;//顺便把父窗体的值先传给子窗体1718//这一行不需要再写f2.ShowDialog();或者
f2.Show()否则£2会弹出来两次1920if(f2.ShowDialog()==DialogResu工t.OK)//这样的语句是
合法的:DialogResultf=f2.ShowDialog();21{22textBoxl.Text=
f2.TextBox2Value;23//f2.Clos㊀();//这一句写或者不写,£2都会关闭24}
25}26}27}
Form2中:
1usingSystem;2usingSystem.Windows.Forms;34namespaceWindowsForms跨窗体传值大全5{6
publicpartialclassForm2:Form7{8publicForm2()9{10
InitializeComponent();11)1213publicstringTextBox2Value〃将外部不可访问的
textBox2.Text封装成属性TextBoxlValuel4{15set{textBox2.Text=value;}16
get{returntextBox2.Text;}17}1819privatevoidbutton2_Click(objectsender,
EventArgse)20{21this.DialogResult=DialogResult.OK;//这里的DialogResult是
Form2类对象的属性22}2324}25}
方法3:通过委托事件来传值。(这种方式可以实现不同控件数据实时联动的复杂功能)
Forml中:
1usingSystem;2usingSystem.Windows.Forms;34namespaceWindowsForms跨窗体传值大全5{6
publicpartialclassForml:Form7{8publicForml()9{10
InitializeComponent();11}1213privatevoidbuttonl_Click(objectsender,EventArgs
e)14{15Form2f2=newForm2();16f2.ChangeText+=new
ChangeTextHandler(Change_Text);//将事件和处理方法绑在一起,这句话必须放在f2.ShowDialog();前面17
f2.ShowDialog();18}1920publicvoidChange_Text(stringstr)21{22
textBoxl.Text=str;23}24}25}
Form2中:
1usingSystem;2usingSystem.Windows.Forms;34namespaceWindowsForms跨窗体传值大全5{6
publicdelegatevoidChangeTextHandler(stringstr);//定义委托78publicpartialclassForm2:
Form9{10publicForm2()11{12InitializeComponent();13)1415
publiceventChangeTextHandlerChangeText;//定义事件1617privatevoid
button2_Click(objectsender,EventArgse)18{19if(ChangeText!=null)//判断事
件是否为空20{21ChangeText(textBox2.T㊀xt);//执行委托实例22
this.Close();23)24}25}26}
可以用.NET提供的Actionv>泛型委托和lambda表达式简化上面这个例子:
1//Forml中:2usingSystem;3usingSystem.Windows.Forms;45namespaceWindowsForms跨窗体传
值大全6{7publi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 1-2-Cyclohexylenedinitrilotetraacetic-acid-Standard-生命科学试剂-MCE
- 第三章算法基础(复习知识清单+练习题2)-高中信息技术必修1期末复习粤教版
- 三年级学习方法讲座模板
- 人教版2024-2025学年六年级数学上册专项提升第三单元专练篇·04:量率对应问题其二(原卷版+解析)
- 环境污染的应急处理预案
- 市政管线迁改施工方案
- 足球训练基地建设项目可行性策划方案
- 小学班级文化建设评比设计方案
- 学校突发安全事故报告制度
- 受限空间安全作业指导书
- 西安公交线路
- 2023年陕煤集团招聘笔试题库及答案解析
- T细胞淋巴瘤2022.v1(英文)-NCCN肿瘤临床实践指南
- 凸透镜成像规律动画可拖动最佳版swf
- GB/T 18916.51-2020取水定额第51部分:对二甲苯
- 2023年教师资格证书补发换发申请表下载
- 安全生产执法监察作业培训课件
- 精品PPT课件模板:抽奖(红包、转盘、九宫格)
- 《天然气加工工艺学》课程教学大纲
- 《千字文》(课堂)课件
- 肢体残疾课件
评论
0/150
提交评论