.NET 窗体间传送数据方法谈 —— 迟来的补遗
来源:互联网 发布:php文件断点续传 编辑:程序博客网 时间:2024/05/21 10:04
方法一:静态变量法
- 优点:发挥静态变量的优势,很少代码就能搞定。
- 缺点:静态变量也容易导致多个窗体共同访问时出现混乱,并且在这两个窗体类的多个实例之间传递的时候不具有相互独立性。
Form1或者同一程序集的其它类中声明一个静态中间变量,如
class Form1 : Form{
...
public static int internalVar; // 也可以是internal static
...
}
然后,Form1以及Form2的实例自然可以方便地访问Form1.internalVar这个中间变量了。
方法二:非静态变量法
- 优点:独立性好。
- 缺点:需要额外建立新变量。主动方要事先获得被动方的引用。
Form2中声明一个中间变量,如
class Form2 : Form{
...
public int internalVar; // 也可以是internal
...
}
然后主动方只要在传送前获得Form2的实例f2就可以访问f2.internalVar了。
方法三:Tag法
- 优点:独立性好,不用额外建立新变量。
- 缺点:主动方要事先获得被动方的引用。此外,Tag是Object类型,读取时需要强制类型转换。
- 注:也可以充分利用其它类似属性来实现,不过Tag属性存在的目的就是数据暂存,具有数据中立的特点,何乐而不为呢。
主动方(可以是Form1实例,也可以是任何其它的实例)某个方法中:
Form2 f2 = new Form2(); // 或者其它方式获得被动方引用
// do something or not
f2.Tag = data; // 传送数据,f2可以在这句代码之后使用该数据
// do something or not
string data = (int)f2.Tag; // 接收数据,主动方可以在这句话之后使用该数据
这样,主动方就可以实现数据的接收和传送。
方法四:窗体所有关系法
- 优点:具有很高的独立性。
- 缺点:主动方要事先获得被动方的引用。本方法会建立窗体所有关系。有可能需要建立额外的变量。
- 注:本法可以基于(非)静态变量法、Tag法等方法。
本例以Tag法为例(省几行代码^_^):
假定已经获得主动方Form2的实例引用f2,假定被动方是当前实例。
f2.Owner = this;
然后,f2内部要想访问被动方的话,只需this.Owner即可获得被动方实例,从而f2内this.Owner.Tag即中间变量。
同样,Form.ShowDialog(Form owner)方法支持自动设定Owner,也可以类似设定窗体所有关系。
方法五:构造函数法(非Form引用)
- 优点:具有很高的独立性。
- 缺点:如果构造函数参数传递的不是引用类型变量,那么只能实现单向传送;此外,此法只能在实例初始化的时候传送。(静态构造函数类似)
被动方新建一个构造函数,如
class Form2 : Form{
public Form2(int data){
// 将接收的data存储到实例中或者直接处理(单向)
}
}
class Form2 : Form{
public Form2(ReferenceType data){
// 由于此处data是某种引用类型,所以主动方和被动方同时引用一个变量,所以是双向的
}
}
方法六:构造函数法(Form引用)
- 注:本法基于非静态变量法、窗体所有关系法以及构造函数法(非Form引用)中双向传送类别。
被动方声明一个中间变量,如
class Form1 : Form{
...
public int internalVar; // 也可以是internal
...
}
主动方新建一个构造函数,如
class Form2 : Form{
public Form2(Form1 f1){
// 获得了被动方Form1的实例引用
}
}
这样,主动方可以通过访问被动方实例f1.internalVar即可实现访问。
方法七:方法传送法
- 优点:具有很高的独立性。逻辑功能上具有自身的意义。
- 缺点:如果方法参数传递的不是引用类型变量,那么只能实现单向传送(除非该方法有传回数据用的返回值)。(静态方法类似)
- 注:本法类似于构造函数法。
被动方新建一个成员方法,如
class Form2 : Form{
public void GetData(int data){
// 将接收的data存储到实例中或者直接处理(单向)
}
public void GetData(ReferenceType data){
// 由于此处data是某种引用类型,所以主动方和被动方同时引用一个变量,所以是双向的
}
}
方法八:Remoting法
- 优点:可以跨程序集甚至跨域进行数据传送。
- 缺点:代码量较大,实现机理较为复杂;程序集内部使用速度较慢。
本方法涉及内容较多,暂不进行讨论。有兴趣者可以参考.NET Remoting的相关资料。
方法九:WCF法
- 优点:同Remoting法。提供简便的分布式通信方式。
- 缺点:同Remoting法。此外,该方法仅适用于.NET 3.0平台。
- 注:WCF是Windows Communication Foundation的缩写,是.NET 3.0上的新一代分布式通信平台,有效地组织各类Windows平台之上的通信方式。
本方法涉及内容较多,暂不进行讨论。有兴趣者可以参考WCF的相关资料。
http://blog.programfan.com/trackback.asp?id=25658
- .NET 窗体间传送数据方法谈 —— 迟来的补遗
- 窗体与窗体的数据传送
- [VB.NET] 事件的应用:父窗体和子窗体的数据传送
- ASP.NET如何在窗体和窗体之间传送数据
- ASP.NET如何在窗体和窗体之间传送数据
- ASP.NET如何在窗体和窗体之间传送数据
- ASP.NET如何在窗体和窗体之间传送数据
- ASP.NET如何在窗体和窗体之间传送数据(使用类)
- 网络数据传送的三种方法
- 多类带数据传送的Intent实现方法
- c#中怎样在窗体间相互传送数据,且能在修改窗体A的数据时,窗体B能够根据窗体A的数据同时作出反应修改其相应数据
- android接收从其他App传送来的数据
- android 接收从其他App传送来的数据
- .NET通过调用接口来获取数据的方法
- 如何用.net实现两台机子之间的数据间的传送?
- 如何在窗体和窗体之间传送数据
- .Net中Windows窗体间的数据交互
- .Net中Windows窗体间的数据交互
- 僕と若手プログラムとの会話(7)
- 教案:转换课程第2章DOM编程-document对象
- WebService优点和缺点小结
- Attribute在.net编程中的应用
- linux下Samba服务器的设置
- .NET 窗体间传送数据方法谈 —— 迟来的补遗
- 发一个比较好看的
- SMB/CIFS Opportunistic Locks
- 初学51地图,感觉LTEvent API注释可能存在问题
- XFire 入门
- 最好用的JS编辑器:JSEclipse及YUT-EXT库的智能代码完成功能
- WTL目录
- 推荐两款基于Eclipse的Javascript插件
- 文本框中输入法切换问题