`
izuoyan
  • 浏览: 8882408 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

在VB.NET中实现多窗体同步的完整解决方案

阅读更多
我用单个窗体的多实例构建一个 Windows 窗体

<nobr><strong style="border: 0px none ; color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;" onmouseover='isShowAds = true;isShowAds2 = true;KeyGate_ads.Move(this,"","%u901A%u8FC7%u4E00%u4E2A%u7B80%u5355%u7684%u95EE%u5019%u7A0B%u5E8F%20HelloServer%20%u6765%u4ECB%u7ECD","-100879","应用程序","%u5F00%u53D1%u9AD8%u6027%u80FD%u7F51%u7EDC%u7A0B%u5E8F","http%3A//ibm.csdn.net/ISN_J.aspx%3Faction%3DJMP%26pointid%3D2613", event)' onmouseout="isShowAds = false;isShowAds2 = false" onclick='javascript:window.open("http://s4.17luntan.com/ClickPortal/WebClick.aspx?id=-100879&amp;k=%u5E94%u7528%u7A0B%u5E8F&amp;siteid=0098295a-e262-40f7-ae50-7a6fbbdb678b&amp;url=http%3A//news.csdn.net/n/20040603/47067.html&amp;gourl=http%3A//ibm.csdn.net/ISN_J.aspx%3Faction%3DJMP%26pointid%3D2613&amp;parm=226DC19B75C55210FCFF44A0FB9B26AD7463BDE5061EEFFF&amp;alliedsiteid=0");' class="kgb">应用程序</strong></nobr>。我想把它写成 这样一个程序:对该窗体任何一个实例的操作都会在所有其它实例上反映出来。我该怎么做?

  这是一个有趣的问题。我保证某些聪明的<nobr><strong style="border: 0px none ; margin: 0px; padding: 0px; color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;" onmouseover='isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u7F16_u7A0B";KeyGate_ads.ShowGgAds(this,"_u7F16_u7A0B",event)' onmouseout='isShowGg = false;InTextAds_GgLayer="_u7F16_u7A0B"' onclick='javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&amp;ai=BcTl5-GQASJHUH4buuQPx5tD2Df2B2E7hn5HRBq2HmMYE4JgXEAIYAiDPgYcKKBQ4AFC7xq_5AWCdudCBkAWyAQ1uZXdzLmNzZG4ubmV0yAEB2gEqaHR0cDovL25ld3MuY3Nkbi5uZXQvbi8yMDA0MDYwMy80NzA2Ny5odG1sqQIKUbvdUiyDPsACAcgC_ZqlBagDAegD2wX1AwAEAAA&amp;num=2&amp;adurl=http://www.ni.com/pac/zhs%3Fmetc%3Dmtptqy&amp;client=ca-pub-3578421812762734");GgKwClickStat("编程","ni.com/pac/zhs","afc","2000084115");' class="kgb">编程</strong></nobr>好手会建议我使用委托。在这种事情发生之前,让我们 先探究一下这个问题的几种解决方案。

  假定我有两个窗体,每个窗体都有两个 textbox 控件:txt1stData 和 txt2ndData。我怎样才能保持这两个窗体中的控件同步呢?对于我们讨论的问题来说,有两个或十个窗体都不重要,问题是相同的。

  第一个办法相对<nobr><strong style="border: 0px none ; margin: 0px; padding: 0px; color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;" onmouseover='isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u7B80_u5355";KeyGate_ads.ShowGgAds(this,"_u7B80_u5355",event)' onmouseout='isShowGg = false;InTextAds_GgLayer="_u7B80_u5355"' onclick='javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&amp;ai=BZRJQ-GQASJHUH4buuQPx5tD2Daj_tU7Mm6q0BcCNtwGQvwUQBBgEIM-BhwooFDgAUMLd-Kb8_____wFgnbnQgZAFsgENbmV3cy5jc2RuLm5ldMgBAdoBKmh0dHA6Ly9uZXdzLmNzZG4ubmV0L24vMjAwNDA2MDMvNDcwNjcuaHRtbKkCClG73VIsgz7IAtSS3gWoAwHoA9sF9QMABAAA&amp;num=4&amp;adurl=http://tj.28.com/ws/zkjm/index.htm%3FbannerID%3D47346%26kw%3D%25BD%25D5%25B8%25D1%25C6%25F8%25BB%25AF%25C2%25AF%26fz%3D700&amp;client=ca-pub-3578421812762734");GgKwClickStat("简单","28.com","afc","2000084115");' class="kgb">简单</strong></nobr>。事实上,它甚至比我们直接使用委托更为简单,我想委托有时会给人用牛刀杀鸡的感觉。首先,我建立一个类它包含我希望与应用程序中的所有窗体共享的属性(参见 Figure 1)。例如,MyData 和 MoreData 拥有每个窗体都能显示的<nobr><strong style="border: 0px none ; color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;" onmouseover='isShowAds = true;isShowAds2 = true;KeyGate_ads.Move(this,"","%u4E00%u4E2A%u771F%u6B63%u7684%u591A%u4EFB%u52A1%u7CFB%u7EDF","-100850","数据","AIX%20V5.3%20%u7CFB%u7EDF%u7BA1%u7406","http%3A//ibm.csdn.net/ISN_J.aspx%3Faction%3DJMP%26pointid%3D2488", event)' onmouseout="isShowAds = false;isShowAds2 = false" onclick='javascript:window.open("http://s4.17luntan.com/ClickPortal/WebClick.aspx?id=-100850&amp;k=%u6570%u636E&amp;siteid=0098295a-e262-40f7-ae50-7a6fbbdb678b&amp;url=http%3A//news.csdn.net/n/20040603/47067.html&amp;gourl=http%3A//ibm.csdn.net/ISN_J.aspx%3Faction%3DJMP%26pointid%3D2488&amp;parm=226DC19B75C55210FCFF44A0FB9B26AD7463BDE5061EEFFF&amp;alliedsiteid=0");' class="kgb">数据</strong></nobr>。我将很快回到这个类来。

  第二,正如我早先提到的我用相同的控件(txt1stData 和 txt2ndData)建立了两个窗体。你可以参考 Figure 2 的布局。两个窗体都有完全相同的数据,并且我将很快解释为什么。


Figure 2 窗体布局

   下面,我建立一个名为 modGeneral 的模块并加入下面一行代码:

  Friend DataStuff As DataClass

  这一行代码为我的新类 DataClass 创建了一个友元变量,使你可以完全访问程序集,对这个简单例子来说,也就是指完整的应用程序。然后我添加了下面的代码到 Form1 的 Load 事件:

  DataStuff = New DataClass

  Me.txt1stData.DataBindings.Add("Text", DataStuff, "MyData")

  Me.txt2ndData.DataBindings.Add("Text", DataStuff, "MoreData")

  第一行建立一个 DataClass 新实例。下面两行代码将数据绑定到 textbox 控件。对这个窗体而言,就这么些操作!

  现在,你怎样让它们与 Form2 和其它窗体上的数据同步呢?将下面两行加入到 Form 2 的窗体load 事件中去:

  Me.txt1stData.DataBindings.Add("Text",DataStuff, "MyData")

  Me.txt2ndData.DataBindings.Add("Text",DataStuff, "Moredata")

  这个方法容易确保所有窗体上的几乎任何类型的数据处于同步状态。你可以简单地将控件绑定到某个类的相同实例上,这就行了。

  现在来看另一个方法。我创建了一个名为 frmBase 的新窗体。这时我在上面放一个 textbox (txtNextData)和 label。我想 让应用程序的每个窗体都共享这个 textbox 和 label,并且我希望它们互相之间保持同步,于是我重建这个<nobr><strong style="border: 0px none ; margin: 0px; padding: 0px; color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;" onmouseover='isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u5DE5_u7A0B";KeyGate_ads.ShowGgAds(this,"_u5DE5_u7A0B",event)' onmouseout='isShowGg = false;InTextAds_GgLayer="_u5DE5_u7A0B"' onclick='javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&amp;ai=B82-6-GQASJHUH4buuQPx5tD2DY7KplGmpLLpBMCNtwHAixEQBxgHIM-BhwooFDgAUOSHwLUEYJ250IGQBbIBDW5ld3MuY3Nkbi5uZXTIAQHaASpodHRwOi8vbmV3cy5jc2RuLm5ldC9uLzIwMDQwNjAzLzQ3MDY3Lmh0bWyAAgGpAgpRu91SLIM-yAK-sJoFqAMB6APbBfUDAAQAAA&amp;num=7&amp;adurl=http://www.rigol.com/products_waveform_generators.aspx&amp;client=ca-pub-3578421812762734");GgKwClickStat("工程","www.rigol.com","afc","2000084115");' class="kgb">工程</strong></nobr>。通过从新的 frmBase 中的继承 ,我创建了 Form1 和Form2,因此它们继承了所有新的控件。但是我怎样能保持这些控件同步呢?这时必须写一点代码去达到此效果,这些代码在单个的类中,通过简单地调用一个函数而被复用。

  Figure 3 中的代码展示了这个称为 modGeneral 模块。它的第一个任务是定义两个变量:MyForms 和 localNextData。MyForms 是一个 集合,它将包含我想要同步的窗体列表。localNextData变量将储存所有我想要在窗体里显示的数据。注意这些变量可以驻留于某个类中而不是某个模 块里。

  AddForm 过程来自 modGeneral,带一个窗体实例参数,并将其加入 MyForms 集合中。我将在UpdateControlsNextData 过程中使用这个 集合以决定哪些窗体要更新。AddForm 也调用UpdateControlsNextData 来确保一个新窗体是用正确的数据更新的。

  modGeneral 中的其它代码是 NextData 属性。这些属性的 set 存取器更新 localNextData 并也调用 UpdateControlsNextData 去同步所有窗体。这时所有我需要做的是 在想要改变它时设置 NextData,通过调用 UpdateControlsNextData,所有窗体将被更新。

分享到:
评论

相关推荐

    asp.net知识库

    实现C#和VB.net之间的相互转换 深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述的补白 asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP...

    Visual.Basic.2010.&.NET4.高级编程(第6版)-文字版.pdf

    1.3.1 在代码中设置窗体属性 29 1.3.2 visual studio的其他组件 37 1.4 增强示例应用程序的功能 37 1.4.1 定制代码 39 1.4.2 构建应用程序 43 1.4.3 重用第一个windows窗体 50 1.5 visual studio 2010中...

    C#微软培训资料

    18.2 在 C #代码中调用 C++和 VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...

    Access 2007 VBA宝典 1/4

    您可以学习编写Vi-sual Basic代码,从而自动执行Access数据库任务、创建独立脚本、提取及合并数据,而且可以将各种强大的解决方案结合起来,从而提高在Office家族成员间工作时的效率。无论您是初学者还是有经验的...

    Access 2007 VBA宝典 4/4

    您可以学习编写Vi-sual Basic代码,从而自动执行Access数据库任务、创建独立脚本、提取及合并数据,而且可以将各种强大的解决方案结合起来,从而提高在Office家族成员间工作时的效率。无论您是初学者还是有经验的...

    Access 2007 VBA宝典 3/4

    您可以学习编写Vi-sual Basic代码,从而自动执行Access数据库任务、创建独立脚本、提取及合并数据,而且可以将各种强大的解决方案结合起来,从而提高在Office家族成员间工作时的效率。无论您是初学者还是有经验的...

    Access 2007 VBA宝典 2/4

    您可以学习编写Vi-sual Basic代码,从而自动执行Access数据库任务、创建独立脚本、提取及合并数据,而且可以将各种强大的解决方案结合起来,从而提高在Office家族成员间工作时的效率。无论您是初学者还是有经验的...

    Visual C++ 2005入门经典--源代码及课后练习答案

    1.6.4 项目和解决方案 11 1.6.5 设置Visual C++ 2005的选项 23 1.6.6 创建和执行Windows应用程序 24 1.6.7 创建Windows Forms应用程序 26 1.7 小结 29 第2章 数据、变量和计算 31 2.1 C++程序结构 31 ...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    JAVA上百实例源码以及开源项目源代码

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

Global site tag (gtag.js) - Google Analytics