注册 登录
编程论坛 C# 论坛

如何关闭窗口1后,把窗口1的某个值传给窗口2?

sundayforday 发布于 2012-10-13 12:20, 5077 次点击
窗口1有一个关闭按钮和一个string数值,点关闭后,会打开窗口2,并关闭自身,我在窗口LOAD事件里面无法获取窗口1里面的string的数值,隐藏后可以获取,但是关闭后无法获取。请问可以在关闭窗口1的情况下,打开窗口2后获取数值吗?是怎么实现的?把数值存放在内存中,在让窗口2读取?请给出相关的代码....我是初学C#的...不要讲的太复杂...真心看不懂.....
8 回复
#2
何事惊慌2012-10-13 17:58
在窗口2几个属性,创建的时候带上属性或者直接写个静态的类去保存给窗口2的构造函数重写,网上很多种这个例子
#3
sundayforday2012-10-14 01:05
我在网上找的项目都是ASP网站的项目。一点也看不懂...我要的是C#的项目一个都找不到,我问的是windows应用程序,不是ASP...

[ 本帖最后由 sundayforday 于 2012-10-14 01:18 编辑 ]
#4
lybh242012-10-14 21:13
方法很多,用委托,用多线程。。。都可以实现:
窗体1:
程序代码:
using System;
using System.Collections.Generic;
using using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Threading;//线程引用

namespace FrmToNext
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        string pass;//接收txtbox的值
        private void button1_Click(object sender, EventArgs e)
        {
            pass=this.textBox1.Text.Trim();
            Thread th = new Thread(new ThreadStart(GotoFrm2));//创建线程
            th.SetApartmentState( ApartmentState.STA);//设置线程单元状态为STA (注:这句是后来加上的,刚开始忘记会有THreadStateException异常了)
            th.Start();//开启线程

        }

        public void GotoFrm2()
        {
              Application.Exit();//关闭当前
              Application.Run(new Form2(pass));//打开窗体2
        }
    }
}
窗体2:
程序代码:
using System;
using System.Collections.Generic;
using using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace FrmToNext
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        public Form2(string getstr) //getstr就是form1传给form2的值
        {
            InitializeComponent();

            this.label1.Text = getstr;
        }
    }
}



[ 本帖最后由 lybh24 于 2012-10-15 10:10 编辑 ]
#5
smart07212012-10-19 17:15
嗯,这个可以通过很多办法实现!其实ASP跟C#的窗体间传值原理是一样的,编程这东西不能死学,要理清思路,灵活应用。就像你这个问题,如楼上几位所说,方法很多,可以通过窗体属性传递,也可以通过公共类或全局变量,也可以用委托,构造函数,多线程等等……!当你各种方法都会了,你再碰到这种问题的话,就不是想怎么能实现,而是想要用哪种方法更好。效率更高!具体问题具体分析。现在你刚学,你要简单易懂就可以定义公共属性来实现
如你要主窗体传值给子窗体:(如有些软件需要登录,登录后主界面会显示你的账号或用户名一样)
现在登录窗口界面定义两个TextBox用于账号和密码的输入,还有一个Button按钮用于登录
登录触发时间代码:
程序代码:
private void button1_Click(object sender, EventArgs e)
        {
           // 省略 判断账号和密码是否正确?         
            frmMain fm = new frmMain();
            this.Hide();               //隐藏当前窗体
            fm.Username = this.txtUserName.Text; //把用户名传值给要显示的这窗体
            fm.Show();
        }
在窗体在定义一个属性,用于记录用户名
程序代码:
public partial class frmMain : Form
    {
        public string Username = string.Empty;//就是加这一句,定义并初始化
        public frmMain()
        {
            InitializeComponent();
        }
         private void frmMain_Load(object sender, EventArgs e)//加载该窗体时把Username用label或Textbox控件显示出来
        {
            this.label1.Text = Username;
        }
    }
其他方法也很简单,你自己网上找找看看!




[ 本帖最后由 smart0721 于 2012-10-19 17:26 编辑 ]
#6
xb5943289802012-10-21 16:48
人家要的是关闭  不是影藏
#7
fily13142012-10-21 22:36
最简单的就是用一个类定义一些静态变量,在窗口1关闭事件中给这些变量赋值,
在窗口2中就可以直接使用那些变量了
#8
迪拜axq2015-07-17 13:38
回复 4楼 lybh24
新手 学习了 厉害
#9
wangnannan2015-07-17 16:12
你完全可以把实例放到全局栈里嘛 不要的时候 随时在栈里清除
1