zoukankan      html  css  js  c++  java
  • 窗口间传值的几种方法

    刚開始学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, "username", 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修饰的成员能够被直接訪问。

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


    事实上非常easy,就刚才的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是否要显示控件。


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

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

    大笑

  • 相关阅读:
    HDOJ 1069_大二写
    HDOJ 2037:今年暑假不AC_大二写
    第二次HDOJ:1058
    HDOJ 1019
    第二次 HDOJ 1003
    第二次做HDOJ 1051
    memset()的用法
    数据结构中的频度含义
    程序框图的书写
    python课堂整理22----装饰器进阶
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7255413.html
Copyright © 2011-2022 走看看