回 帖 发 新 帖 刷新版面

主题:From传值

我在Form1中new Form2 同时传值  在Form2中进行操作后将新获得的值返回From1
我该怎么做呢

回复列表 (共7个回复)

沙发

请看FAQ中的窗体传值问题

板凳

实现从从窗体向主窗体传递数据


首先要我们要明确,主窗体其实是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 楼

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 楼

这个问题我以前也接触过,开始的时候我也找不到问题的原因,后来我进了一个技术交

流群,这个群里的人挺多的,在里面可以沟通技术,你可以进去看一下.群号是:六@二@

八@七@八@零@四@三。另外,这个群里可以接项目。

5 楼

新建一个类
添加一行public static string a;
就行了。

6 楼

不是做win form的,做web的,所以回答不了这问题,谢谢!

7 楼

这么麻烦!
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了~~~

我来回复

您尚未登录,请登录后再回复。点此登录或注册