zoukankan      html  css  js  c++  java
  • C#窗体传值方法总结

    窗体传值是在学习窗体应用程序时碰到的一类比较常见的问题,现将窗体传值方法做了一点总结,方法如下:

    <1>声明全局变量传值:

    在Form1中声明全局变量,如下所示:

    1 public static string str = "窗体1的值";

    通过Form1的button1_Click事件即可将此全局变量传递给Form2,Form1的全局变量str在Form2中可以直接访问,代码如下所示:

    1         private void button1_Click(object sender, EventArgs e)
    2         {            
    3             Form2 frm2 = new Form2();
    4             frm2.Show();
    5         }
    1         private void Form2_Load(object sender, EventArgs e)
    2         {
    3             this.label1.Text = Form1.str;                       
    4         }

    <2>通过构造函数传值:

    重载Form2的构造函数,使其能够接受一个来自Form1的参数,重载代码如下所示:

            private string str;
            public Form2(string s)
            {
                InitializeComponent();
                this.str = s;        
            }

    上面代码中定义的string变量str用来存储从Form1传递进来的参数。

    在Form1的button1_Click事件中实例化Form2并给其传递Form1的一个参数,代码如下所示:

            private void button1_Click(object sender, EventArgs e)
            {
                string s = this.textBox1.Text;
                Form2 frm2 = new Form2(s);
                frm2.Show();
            }

    在Form2的Form2_Load中即可接受这个参数,接受这个参数值的代码如下所示:

            private void Form2_Load(object sender, EventArgs e)
            {
                this.label1.Text = str;                   
            }

    这样,在单击Form1的button1之后,Form2便会蹦出来,Form2的label1便会显示这个从Form1传进来的值。

    <3>在窗体中声明公共属性进行传值:

    在Form2中声明公共属性,代码如下所示:

            private string username;
    
            public string Username
            {
                get { return username; }
                set { username = value; }
            }
            private string password;
    
            public string Password
            {
                get { return password; }
                set { password = value; }
            }

    这样,在Form1中即可访问这些属性,也就可以将Form2中这些公共属性的值传递给Form1了,并且也可以从Form1中向Form2的这些公共属性传值。代码如下所示:

    (1)Form1向Form2传值:

            private void button1_Click(object sender, EventArgs e)
            {
                Form2 frm2 = new Form2();
                frm2.Username = "Jack";  //Form1向Form2传值
                frm2.Password = "J1234";
           frm2.Show();  }
            private void Form2_Load(object sender, EventArgs e)
            {
                textBox1.Text = username;
                textBox2.Text = password;
            }

    (2)Form2向Form1传值:

            private void textBox1_TextChanged(object sender, EventArgs e)
            {
                this.Username = textBox1.Text;
            }
    
            private void textBox2_TextChanged(object sender, EventArgs e)
            {
                this.Password = textBox1.Text;
            }
            private void button1_Click(object sender, EventArgs e)
            {
                Form2 frm2 = new Form2();
                frm2.Username = "Jack";  //Form1向Form2传值
                frm2.Password = "J1234";            
                comboBox1.Items.Add(frm2.Username);  //Form2向Form1传值
                comboBox1.Items.Add(frm2.Password);
                frm2.Show();
            }   

    声明公共属性传值比较灵活,受限较少,因此比较好用。但是或许这会影响数据的安全性哦。

    <4>传递整个窗体进行传值。

    类似于构造函数传值,将窗体作为构造函数的参数即可传递整个窗体了。代码如下所示:

            private void button1_Click(object sender, EventArgs e)
            {
                Form2 f2 = new Form2(this);
                f2.Show();
            }   
            Form1 frm1;
            public Form2(Form1 f1)
            {
                InitializeComponent();
                this.frm1 = f1;            
            }
    
            private void Form2_Load(object sender, EventArgs e)
            {
                this.textBox1.Text = frm1.ActiveControl.ToString();
            }

    这样能把Form1整个窗体传递给Form2,在Form2里即可操作Form1的数据及其控件了。

    <5>更改系统文件:

    更改Form1.Designer.cs,譬如要使其控件变为公共可访问的,即找到在此文件中声明的控件,将你需要在Form2里访问的控件的访问修饰符修改为public,如下所示:

            private System.Windows.Forms.Button button1;
            private System.Windows.Forms.ComboBox comboBox1;

    将上面的代码里需要更改的控件的访问修饰符更改后保存即可。这种方法我个人感觉不好,有违C#语言的封装性和数据的安全性,个人建议不提倡使用。

    <6>利用委托进行窗体传值:

    这种方法是我在网上看到的,对原代码做了一点点改进,利用定义委托和事件以及构造函数的方法,实现了Form1和Form2互相传值。废话不多说,请看代码:

    Form1部分的代码:

        public partial class Form1 : Form
        {        
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                string str = textBox1.Text;
                Form2 f2 = new Form2(str);
                f2.Translate += new TranslateEventHandler(f2_Translate);            
                f2.ShowDialog();
            }
    
            void f2_Translate(string value)
            {
                textBox1.Text = value;
                //throw new NotImplementedException();
            }               
        }
    View Code

    Form2部分的代码:

        public delegate void TranslateEventHandler(string value);
        public partial class Form2 : Form
        {
            string str;
            public Form2(string s)
            {
                InitializeComponent();
                this.str = s;
            }
    
            public event TranslateEventHandler Translate;
            
            private void button1_Click(object sender, EventArgs e)
            {
                Translate(textBox1.Text);
                this.Close();
            }
    
            private void Form2_Load(object sender, EventArgs e)
            {
                this.textBox1.Text = str;
            }            
        }
    View Code

    Form1,Form2设计如下图所示:

            

    如果你无法简洁的表达你的想法,那只说明你还不够了解它。
  • 相关阅读:
    设计模式之美学习-设计原则-面向对象基本概念(一)
    redis-分布式锁-设计与使用
    linux常用命令记录(一)
    redis-布隆过滤器使用
    jdk源码阅读-ConcurrentLinkedQueue(一)
    支付宝支付接口-app支付沙箱环境
    RocketMQ-安装
    支付宝支付接口-运行支付宝demo
    elasticsearch-文档-父子文档(十一)
    RTMPdump 源代码分析 1: main()函数
  • 原文地址:https://www.cnblogs.com/zhuochangjing/p/3910752.html
Copyright © 2011-2022 走看看