当前位置:编程学习 > C#/ASP.NET >>

大家好,在winforms中如何实现窗体间的传值??

我听网友说,通过PUBLIC参数就可以了,但是我试了多次都没成功。

我做了两个窗体

一个是form1,上面有一个combox1(含teacher,student两个编辑项),还有一个登陆按钮
代码如下:
namespace session
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private string xiaoname;
        public string  customername
        {
            get
            {
                return(xiaoname);
            }
            set 
           {
                
                xiaoname=value;
           }
        }


        private void button1_Click(object sender, EventArgs e)
        {
            if (comboBox1.Text == "teacher")
            {
                Form2 fm2 = new Form2();
                fm2.Show();
            
            }
            if (comboBox1.Text == "student")
            {
                Form2 fm2 = new Form2();
                fm2.Show();

            }
            this.customername = (string)comboBox1.ValueMember;
            
        }      
    }
}

还有一个窗体就是form2,只含有一个标签 label,显示form1中combox的选项(即身份),但是显示不了,不知道哪里错了,请大家帮忙看看,代码如下:

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

        private void Form2_Load(object sender, EventArgs e)
        {
            Form1 fm1 = new Form1();
            label1.Text = fm1.customername;
        }
    }
}
--------------------编程问答--------------------

        private void Form2_Load(object sender, EventArgs e) 
        { 
            label1.Text = (((Form1)this.Owner).Controls["comboBox1"] as System.Windows.Forms.ComboBox).Text;
        } 

楼主需要注意的是:Form1 fm1 = new Form1(); 
            label1.Text = fm1.customername; 这种写法相当于重新建了个Form,而不是你打开的那个Form1
因此值是不会有的。(Form1)this.Owner) 这样得到的是父窗体,这个才是你第一次打开的窗体! --------------------编程问答-------------------- Form2 改为:

namespace session
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        
        private string customername;
        public string CustomerName 
        {
             get {return this.customername;}
             set{this.CustomerName=this.customername}
         }
        private void Form2_Load(object sender, EventArgs e)
        {
            label1.Text = this.customername;
        }
    }
}  --------------------编程问答-------------------- Form1 改为;
namespace session
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private string xiaoname;
        public string  customername
        {
            get
            {
                return(xiaoname);
            }
            set
          {
               
                xiaoname=value;
          }
        }


        private void button1_Click(object sender, EventArgs e)
        {
    
                Form2 fm2 = new Form2();
                fm2.CustomerName =(string)comboBox1.ValueMember;
                fm2.Show();

        }     
    }
}  --------------------编程问答-------------------- 你思路反了 --------------------编程问答-------------------- 请问上面2位的代码都能成功的运行吗??? --------------------编程问答-------------------- 当然可以。你试试 就晓得 --------------------编程问答-------------------- 不想用xray2005的方法,因为我还要弹出许多其他的窗口,所以我想使用ouc_ajax的方法。可惜的是代码输入进去无法运行,请大家在帮忙看看!! --------------------编程问答-------------------- 谢谢xray2005!!! --------------------编程问答-------------------- 你可以在Form2中添加一个字段: 
private Form1 fm1;
然后在Form2的构造函数中写:
public Form2(Form1 fm1) 
        { 
            InitializeComponent(); 
            this.fm1 = fm1;
        } 
然后在Form1的button时间里这么调用:
if (comboBox1.Text == "teacher") 
            { 
                Form2 fm2 = new Form2(this); 
                fm2.Show();             
            } 
这样你就可以直接在Form2中
private void Form2_Load(object sender, EventArgs e) 
        { 
            //Form1 fm1 = new Form1();  //注意这行已经被注释,不需要创建新的Form1实例.
            label1.Text = fm1.customername; 
        } 
--------------------编程问答-------------------- 路过 --------------------编程问答--------------------
引用 7 楼 gene31415926 的回复:
不想用xray2005的方法,因为我还要弹出许多其他的窗口,所以我想使用ouc_ajax的方法。可惜的是代码输入进去无法运行,请大家在帮忙看看!!


怎么无法运行了??

忘了说了,Form1中改成 
               Form2 fm2 = new Form2(); 
                fm2.Show(this);          //也就是表示这是弹出窗体Form1的父窗体
这样再在Form2中调用
  label1.Text = (((Form1)this.Owner).Controls["comboBox1"] as System.Windows.Forms.ComboBox).Text;  --------------------编程问答-------------------- 参考:

http://blog.csdn.net/mngzilin/archive/2010/01/01/5118256.aspx --------------------编程问答-------------------- 直接这样改
              Form2 fm2 = new Form2(); 
                fm2.Show(this);     

ouc_ajax改的比较实惠,不错,谢谢楼上各位热心的朋友!!! --------------------编程问答-------------------- -。- 搞不懂说啥呢 

我理解这样 2个FORM 然后 你点 一个按钮 然F2弹出来 在点F1上的按钮 让F2的label.Text 改变?

  public Form1()
        {
            InitializeComponent();
        }
        Form2 f2 = new Form2();
        private void button1_Click(object sender, EventArgs e)
        {
       
            f2.Show();
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            f2.label1.Text = this.textBox1.Text;
        }


这是F1代码 你给F2的label1 改成public 就OK了 最简单了 

再不然 就用 构造函数传过去 --------------------编程问答-------------------- 我觉得用构造函数传值很容易实现啊,窗体之间传值就是类之间传参啊,一个窗体生成另一个窗体时给她传上参数
var form=new Form2(参数,参数………………);
form.ShowDialog(this); --------------------编程问答-------------------- xray2005
你好
你做的方法让人看的头昏
我试了一下,也不行 --------------------编程问答-------------------- 用构造函数传值比较简单,如果嫌麻烦,用静态属性更简单啊 --------------------编程问答-------------------- public static string temp;声明一个静态属性 --------------------编程问答--------------------
引用 18 楼 zhuzhuaihuzi 的回复:
public static string temp;声明一个静态属性

同意 --------------------编程问答--------------------
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,