主题:From传值
wuchenjie001
[专家分:60] 发布于 2008-02-24 21:25:00
我在Form1中new Form2 同时传值 在Form2中进行操作后将新获得的值返回From1
我该怎么做呢
回复列表 (共7个回复)
沙发
jzyray [专家分:20610] 发布于 2008-02-24 22:51:00
请看FAQ中的窗体传值问题
板凳
zhuliangcsharp [专家分:30] 发布于 2008-02-25 18:45:00
实现从从窗体向主窗体传递数据
首先要我们要明确,主窗体其实是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过程。
private void InitializeComponent ( )
{
this.textBox1 = new System.Windows.Forms.TextBox ( ) ;
this.label1 = new System.Windows.Forms.Label ( ) ;
this.button1 = new System.Windows.Forms.Button ( ) ;
this.SuspendLayout ( ) ;
this.textBox1.Location = new System.Drawing.Point ( 107 , 71 ) ;
this.textBox1.Name = "textBox1" ;
this.textBox1.Size = new System.Drawing.Size ( 140 , 21 ) ;
this.textBox1.TabIndex = 0 ;
this.textBox1.Text = "" ;
this.label1.Location = new System.Drawing.Point ( 17 , 78 ) ;
this.label1.Name = "label1" ;
this.label1.TabIndex = 1 ;
this.label1.Text = "传递来的数据:" ;
this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat ;
this.button1.Location = new System.Drawing.Point ( 104 , 143 ) ;
this.button1.Name = "button1" ;
this.button1.Size = new System.Drawing.Size ( 91 , 41 ) ;
this.button1.TabIndex = 2 ;
this.button1.Text = "显示Form2" ;
this.button1.Click += new System.EventHandler ( this.button1_Click ) ;
this.AutoScaleBaseSize = new System.Drawing.Size ( 6 , 14 ) ;
this.ClientSize = new System.Drawing.Size ( 292 , 273 ) ;
this.Controls.AddRange ( new System.Windows.Forms.Control[ ] {
this.button1 ,
this.textBox1 ,
this.label1 } ) ;
this.MaximizeBox = false ;
this.MinimizeBox = false ;
this.Name = "Form1" ;
this.Text = "从窗体向主窗体传递数据" ;
this.ResumeLayout ( false ) ;
myForm.Send += new Form2.SendMess ( Send ) ;
}
请注意上述代码中粗体的代码,上述代码是定义Form2类实例myForm的Send事件,其中"SendMess"是定义的委托类型。定义"SendMess"和"Send"代码位于项目文件中的Form2.cs中。
4.在Form1.cs中的class的代码区加入下列代码,下列代码是创建一个Form2类的实例,并初始化:
private Form2 myForm = new Form2 ( ) ;
5.在Form1.cs中的Main函数之后,加入下列代码,下列代码的功能是处理myForm中的Send事件,正是在Send事件中实现从从窗体向主窗体传递字符串数据:
private void Send ( string str )
{
textBox1.Text = str ;
//把接收来的字符串通过TextBox组件显示出来
}
3 楼
zhuliangcsharp [专家分:30] 发布于 2008-02-25 18:45:00
6.用下列代码替换Form1.cs中button1组件的Click事件对应的处理代码,下列代码的作用是显示Form2类的实例myForm:
private void button1_Click ( object sender , System.EventArgs e )
{
myForm.ShowDialog ( ) ;
//显示从窗体
}
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过程。
private void InitializeComponent ( )
{
this.label1 = new System.Windows.Forms.Label ( ) ;
this.textBox1 = new System.Windows.Forms.TextBox ( ) ;
this.button1 = new System.Windows.Forms.Button ( ) ;
this.SuspendLayout ( ) ;
this.label1.Location = new System.Drawing.Point ( 30 , 62 ) ;
this.label1.Name = "label1" ;
this.label1.Size = new System.Drawing.Size ( 163 , 23 ) ;
this.label1.TabIndex = 0 ;
this.label1.Text = "传递到主窗体的字符串:" ;
this.textBox1.Location = new System.Drawing.Point ( 37 , 94 ) ;
this.textBox1.Name = "textBox1" ;
this.textBox1.Size = new System.Drawing.Size ( 187 , 21 ) ;
this.textBox1.TabIndex = 1 ;
this.textBox1.Text = "" ;
this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat ;
this.button1.Location = new System.Drawing.Point ( 99 , 155 ) ;
this.button1.Name = "button1" ;
this.button1.Size = new System.Drawing.Size ( 85 , 41 ) ;
this.button1.TabIndex = 2 ;
this.button1.Text = "传递" ;
this.button1.Click += new System.EventHandler ( this.button1_Click ) ;
this.AutoScaleBaseSize = new System.Drawing.Size ( 6 , 14 ) ;
this.ClientSize = new System.Drawing.Size ( 292 , 273 ) ;
this.Controls.AddRange ( new System.Windows.Forms.Control[ ] {
this.button1 ,
this.textBox1 ,
this.label1 } ) ;
this.MaximizeBox = false ;
this.MinimizeBox = false ;
this.Name = "Form2" ;
this.Text = "Form2" ;
this.ResumeLayout ( false ) ;
}
10.在Form2.cs的class代码区添加下列代码,下列代码是在Form2类中增加一个事件类型Send,当然首先要定义一个委托类型SendMess:
public delegate void SendMess ( string str ) ;
//定义委托类型
public event SendMess Send ;
//定义一个事件类型
11.用下列代码替换Form2.cs中button2的Click事件对应的处理代码,下列代码的功能是触发Send事件,传递字符串数据:
public delegate void SendMess ( string str ) ;
//定义委托类型
public event SendMess Send ;
//定义一个事件类型
12.至此,在上述步骤都正确完成,并成功保存后,【VC#中不同窗体数据传递方法03】项目的全部工作就完成了。此时单击快捷键【F5】运行程序,单击主窗体中【显示Form2】按钮,则从窗体Form2就显示出来,在Form2中的【传递到主窗体的字符串】文本框中输入"Hello World!"后,单击【传递】按钮,则程序就能够把字符串"Hello World!"传递到主窗体,并通过主窗体中的【传递来的字符串】文本框显示出来,图01是【VC#中不同窗体数据传递方法03】程序的运行界面:
图01:【VC#中不同窗体数据传递方法03】的运行界面
网上看到的,看一下吧,或许有帮助!
4 楼
rtgongchengshi [专家分:90] 发布于 2008-08-15 09:12:00
这个问题我以前也接触过,开始的时候我也找不到问题的原因,后来我进了一个技术交
流群,这个群里的人挺多的,在里面可以沟通技术,你可以进去看一下.群号是:六@二@
八@七@八@零@四@三。另外,这个群里可以接项目。
5 楼
guishoufk [专家分:0] 发布于 2008-10-21 02:07:00
新建一个类
添加一行public static string a;
就行了。
6 楼
web8686 [专家分:0] 发布于 2008-12-22 22:27:00
不是做win form的,做web的,所以回答不了这问题,谢谢!
7 楼
hanshuzheng [专家分:0] 发布于 2009-03-03 10:49:00
这么麻烦!
1、利用类是引用类型的特性实现Form2到Form1的回调。
2、利用Form类的Tag属性进行参数传递。
实现如下:
1、定义一个类DataClass
2、在Form1里实例化:
Form1.Tat=data;
在Form1里调用Form2窗体代码:
Form2 Frm2=new Form2();
Frm2.Tag=this.Tag;
Frm2.Show();
3、在Form2里调用参数
DataClass data2=(DataClass)this.Tag;
进行相关操作就OK了~~~
我来回复