窗体间传值的几种方法

刚开始学Winform的同学基本上都会遇到窗体传值的问题,如何解决这个问题,其实就是需要解决你对窗体的一个理解。

一定要记住,窗体(Form),它是一个类(Class)!!

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

Form1,前面的修饰都是跟类相关的,例如public partial class,还有Form1的构造方法等等,都是一个类基本拥有的写法,只不过因为继承了基类 Form ,所以才有界面的显示。

如果没有了Form基类,你切换到设计器还能看得到界面吗?

当我们删除了Form基类,设计器就压根儿不起作用了。

结论:任何一个类,如果继承了Form界面,他就可以在设计器中展现出来。

PS:作为出色的程序员,是不会依赖设计器的,而是需要通过代码就能很清楚,大概的界面应该是什么样子。设计器可以作为辅助,但不能成为依赖。

回过头来,窗体传值,其实也就是类之间的传值。

一般使用以下几种:

  • 构造函数的参数传递
  • 公共成员变量
  • 公开属性

构造函数的参数传递

估计很多人的代码都曾经有过以下片段

    public class UserInfo
    {
        public UserInfo(int userId,string userName,int age,string nickName)
        {
            this.UserId = userId;
            this.Age = age;
            this.NickName = nickName;
            this.UserName = userName;
        }

        public int UserId { get; set; }
        public string UserName { get; set; }
        public int Age { get; set; }
        public string NickName { get; set; }
    }

这是一个实体类,有一个构造方法(函数)(咱要专业点,函数都叫做方法

做过三层的人估计也都这样用过吧。

            UserInfo userInfo = new UserInfo(1, "用户名", 20, "昵称");
            BLLHelper.InsertUser(userInfo);

然后在InsertUser里,就可以拿到这些属性的值。

同理,在强调一遍,Form is a class(窗体是一个类)

因此所有的操作都跟类相同。

    public partial class Form2 : Form
    {
        private string _name;
        public Form2(string name)//传入一个参数
        {
            InitializeComponent();
            this._name = name;//_name变量接收值
        }
    }

在Form2的构造方法里加一个参数,再声明一个变量接收

            Form2 form = new Form2("名字");
            form.Show();

使用窗体需要实例化(使用类时需要实例化)

最后,Form2的_name变量就有传过来的值了。

公共变量

什么是公共变量?就是加了public修饰符的变量。

这样的变量因为是public,因此该类被实例化后,public修饰的成员可以被直接访问。

但作者不推荐这么做,至于为什么嘛~百度吧,这个跟架构有关。

其实很简单,就刚才的Form2的代码,把变量的修饰符改成public,然后就不需要构造方法里传参数了。

        public string _name;
        public Form2()
        {
            InitializeComponent();
        }

使用时

            Form2 form = new Form2();
            form._name = "名字";
            form.Show();

公开属性

什么是属性?自己百度吧。

那什么又叫公开属性呢?我们都知道属性有get和set访问器,但是这两个访问器是可以加上访问修饰符的,默认是public。根据自身的程序架构设计给访问器设置不同的修饰符,例如只可读,不可写的属性。也就是你只能通过这个属性获取值,但不可以赋值等等,这里不细说了。

通过属性传值,就好比你给实体类里的那些字段赋值一样。

        public Form2()
        {
            InitializeComponent();
        }

        public string Name { get; set; }
            Form2 form = new Form2();
            form.Name = "名字";
            form.Show();

这种做法我最为推荐。

有人会问,这跟公开属性有个毛的区别?

试问,如果你的set访问器如果不是public的话,你能赋值吗?

        public Form2()
        {
            InitializeComponent();
        }

        public bool Name { get; private set; }

我把set前面加了private

这个时候你来看Form1使用的代码

所以,你的属性没有公开set,其他类是没有办法给它赋值的。

扩展知识

三种传值方式我都说完了,现在扩展一下知识,在程序架构中,构造方法传值和属性传值的优劣势(public变量就不说了,性质跟属性一样,但不推荐使用。)

首先来说一下构造方法。

它会在类的实例化时被调用,如果遇到有参数,必须传入相应参数,可以理解成强制调用方法并传入参数;

而属性比较灵活,不是强制性的,一般是在需要的时候使用,你可以理解成一种配置。

用一个实际点的例子说话

        public Form2(bool showControl)
        {
            if (showControl)
            {
                InitializeComponent();
            }
        }

Form2 要求在使用时传入一个值,这个值的作用是显示控件,所以是强制性的。

            Form2 form = new Form2(false);//表示不显示
            form.Show();

当我在实例化Form2时,强制性要传入一个参数,因为Form2需要这个参数做下一步的动作。

如果是属性的话

        public Form2()
        {
            if (this.ShowControl)
            {
                InitializeComponent();
            }
        }

        public bool ShowControl { get; set; }
            Form2 form = new Form2();//我觉得这里不该显示控件
            form.Show();

            // To do ......

            form.ShowControl = true;//这里需要显示控件
            form.Show();

我可以在处理了一些事情以后选择性的要求Form2是否要显示控件。

有可能有些童鞋不太理解,主要是经验不足啦,这没关系。以后就会慢慢懂了,这也算是一种思路,慢慢地学会如何架构一套程序。

不知道我说清楚了没有,欢迎拍砖!!

时间: 2024-11-07 13:51:55

窗体间传值的几种方法的相关文章

总结窗体间传值的几种方法

要做到类似于这样的效果 第一种:更改子窗体控件属性为public 1.更改子窗体textbox的Modifiers属性为public 2.在主窗体中添加一个子窗体的属性 实例化一个子窗体修改他的textbox的text属性即可 public ChildFrm ChildFrm { get; set; } private void ParFrm_Load(object sender, EventArgs e) { ChildFrm child = new ChildFrm(); ChildFrm

[HTML]页面间传值的五种方法

一.QueryString传值:1. 这是最简单的传值方式,但缺点是传的值会显示在浏览器的地址栏中且不能传递对象,只适用于传递简单的且安全性要求不高的整数值,例如: 2. 新建一个WEB项目,添加一个页面命名为Test1,在页面中添加一个Button命名为btnLogin,再添加两个TextBox分别命名为txtUserName和txtPassWord,添加Button的Click()事件: private void btnLogin_Click (object sender, System.E

asp.net页面间传值的五种方法

一.QueryString传值: 1. 这是最简单的传值方式,但缺点是传的值会显示在浏览器的地址栏中且不能传递对象,只适用于传递简单的且安全性要求不高的整数值,例: 新建一个WEB项目,添加一个页面命名为Test1,在页面中添加一个Button命名为btnLogin,再添加两个TextBox分别命名为tbxUserName和tbxPassWord,添加Buttond的Click()事件: private void btnLogin_Click (object sender, System.Eve

窗口间传值的几种方法

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

PHP页面间传值的几种方法

方法一:require_once //Page a: <?php $a = "hello"; ?> //Page b: <?php require_once "A.php"; echo $a." world!"; ?> 访问b.php会得到:hello world! 方法二:通过页面跳转时携带参数传值 //Page a: <?php $a = "world"; ?> <a href=&

asp.net页面间传值的几种方法

表单提交 传送页面代码 <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>表单提交</title> <script type="text/javascript" language="javascript"> function post() { forPost.action

.NET 页面间传值的几种方法

1. QueryString 这是最简单的传值方式,但缺点是传的值会显示在浏览器的地址栏中且不能传递对象,只适用于传递简单的且安全性要求不高的数值. 传递: location.href="WebForm2.aspx?name=" + yourName&&name2="+ yourName2; 接收: string name = Request.QueryString["name"]; 2. Form 传递: 根据表单内控件的name和val

C#窗体间传值方法总结

假设我们需要点击主窗体FMMain中的某一个按钮时打开子窗体FMChild并将某一个值传给子窗体FMChild,一般情况下,我们点击按钮显示子窗体FMChild的代码为: FMChild fmChild = new FMChild(); fmChild.ShowDialog(); fmChild.Dispose(); 如果我们需要将主窗体FMMain中的string strValueA的值传给FMChild,那么我们首先对strValueA进行如下处理: private string strVa

C# winform窗体间传值(使用委托或事件)

窗体间传值 今天得空,刚好看到网上好多人再找winform窗体间传值的问题,由于昨天项目的优化的感觉不错,就写了个C# winform窗体间传值的demo,希望能给需要的人的带来帮助: 工程的源代码地址:https://github.com/yes-or-no/WinFormTransValueDemoByDelOrEvent.git C#winform窗体间传值,三种方法示例,注释详细.使用方法:使用vs2013打开编译运行即可: 工程中总共介绍了三种方法:###方法1:通过保存对象的引用调用