新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论.NET,C#,ASP,VB技术
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 Dot NET,C#,ASP,VB 』 → .NET 窗体间传送数据方法谈 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 8566 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: .NET 窗体间传送数据方法谈 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 Dot NET,C#,ASP,VB 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 .NET 窗体间传送数据方法谈

    注:

    本文中提到的方法可能会不定期补充,毕竟我不能保证一次性总结那么全面(更何况我一直不擅长总结~~,大家发现什么其它方法或者俺没说清楚的地方给俺说声)。
    以下所有方法均基于两个普通窗体类Form1、Form2(实例对应f1、f2);如果没有专门说明,这两个类均位于同一程序集中。
    传送的数据均以32位整型为例。
    如果没有单独说明,就按照双向传送数据对待。
    本文中提到的数据传送方法并不仅单单适用于窗体间数据传送,很多方法同样适用于更为宽泛的类数据传送。
    方法一:静态变量法

    优点:发挥静态变量的优势,很少代码就能搞定。
    缺点:静态变量也容易导致多个窗体共同访问时出现混乱,并且在这两个窗体类的多个实例之间传递的时候不具有相互独立性。
    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的相关资料。


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/4/19 16:24:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Dot NET,C#,ASP,VB 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/12/27 3:36:35

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    92.773ms