刚开始学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是否要显示控件。
有可能有些童鞋不太理解,主要是经验不足啦,这没关系。以后就会慢慢懂了,这也算是一种思路,慢慢地学会如何架构一套程序。
不知道我说清楚了没有,欢迎拍砖!!