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();
        }
    }

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;
        }
    }

Form1,Form2设计如下图所示:

        

时间: 2024-10-21 22:36:54

C#跨窗体传值的几种方法分析第三版的相关文章

.Net子窗体给父窗体传值的几种方法

其实方法有很多种,这里只介绍3种,大家如有更好的方法可互相学习学习. 1.子父窗体Owner设定法: Form1: void Button_fm1_Click(object sender, EventArgs e) { Form2 fm2 = new Form2(); fm2.Owner = this;   //将Form2的Owner指针指向Form1 fm2.ShowDialog(); } Form2: void Button_fm2_Click(object sender, EventAr

ionic 跨页面传值的几种方法

1.使用AngularJS自带的$cacheFactory服务 $cacheFactory 从字面直译即为缓存工厂,可以用它来生成缓存对象,缓存对象以key-value的方式进行数据的存储,在整个应用内是单例的,可以在service或者controller中注入这个服务,然后就可以用它来自由的存取对象以及各种变量,下面是一个简单例子 [javascript] view plain copy .controller('AppCtrl', function ($scope, $ionicModal,

窗体传值的两种实现方法示例

这两天看前辈的视频初识了窗体传值,于是自己跟着敲了两个Demo,方便以后复习.分享交流. 窗体传值的两种方法:1.通过属性构造方法传值 2.利用委托实现传值. 示例1:点击Form1中的按钮打开From2,点击Form2中的按钮改变窗体Form1的背景颜色. Form1的代码: 1 public partial class Form1 : Form 2 { 3 public Form1() 4 { 5 InitializeComponent(); 6 } 7 8 private void but

一篇文章学会页面传值的10种方法(下)

一篇文章学会页面传值的10种方法(下) 6.代理委托实现页面之间的反向传值 这一种方法就是运用协议实现传值,这种方式也是在工程中常用的一种传值方法.首先创建好ViewController和SubViewController,在ViewController中创建好一个展示信息的Label,在SubViewController中创建好一个TextFeild,我们实现在第二个界面点击屏幕时,将TextFeild中的文字传到第一个界面,然后让背景颜色变色. 效果如下: 代理传值.gif 第一步: 首先我

一篇文章学会页面传值的10种方法(上)

一篇文章学会页面传值的10种方法(上) 1.最简单AB面正向传值 效果如下: 最简单的正向传值.gif 首先我们先创建两个视图控制器ViewController.swift和SubViewController.swift 设置第一个界面 首先在第一个界面创建好一个TextFeild,用来写我们要传的文字 import UIKit class ViewController: UIViewController {     let textField = UITextField()     overr

VMWARE虚拟机不能上网三种方法分析

bridged(桥接模式). NAT(网络地址转换模式) host-only(主机模式). 理论理解: 1.bridged(桥接模式) 在这处模式下,虚拟机等同于网络内的一台物理主机,可对手动设置IP,子网掩码,DNS,且IP地址要和主机的IP在同一网段内.这样,虚拟机就和主机如同连在一个HUB上的两台计算机,只要主机能上网,虚拟机也会在这种模式下上网. 2.host-only(主机模式) 在host-only模式中,所有的虚拟系统是可以相互通信的,但虚拟系统和真实的网络是被隔离开的. 提示:在

JS获取网页中HTML元素的几种方法分析

getElementById getElementsByName getElementsByTagName 大概介绍 getElementById ,getElementsByName ,getElementsByTagName ###adv### 后两个是得到集合,byid只是得到单个对象 getElementById 的用法 举个例子: <a id="link1" name="link1" href=http://homepage.yesky.com>

2019-3-26WinForm窗体间如何传值的几种方法

窗体间传递数据,无论是父窗体操作子窗体,还是子窗体操作符窗体,有以下几种方式: 公共静态变量: 使用共有属性: 使用委托与事件: 通过构造函数把主窗体传递到从窗体中: 一.通过静态变量 特点:传值是双向的,实现简单 实现代码如下: 在一个app类中定义一个静态成员value public class app { public static string value; } 在窗体Form1中这样调用 app.value = "f2"; //给静态成员赋值 new Form2 ( ).Sh

窗体间传值的几种方法

刚开始学Winform的同学基本上都会遇到窗体传值的问题,如何解决这个问题,其实就是需要解决你对窗体的一个理解. 一定要记住,窗体(Form),它是一个类(Class)!! namespace MyForm { public partial class Form1 : Form { public Form1() { InitializeComponent(); } } } Form1,前面的修饰都是跟类相关的,例如public partial class,还有Form1的构造方法等等,都是一个类