- 热门文章:
- · 抛弃win xp!细数升级vista的五大理由
- · 激活windows vista 启动logo画面
- · 关于.NET动态代理的介绍和应用简介
- · 深度体验:windows vista最酷的五大功能
- · windows vista新功能介绍之防误删除技术
- · .NET 2.0中的企业库异常处理块简述
- · wei制度曝光:windows vista界面分五等
- · vista主题确定:aero glass风格最终获胜
- · 全新技术:windows vista系统新技术两则
- · 在.NET 2.0 中使用自定义事务操作
- · 合理攒机:如何满足vista系统的硬件需求
- · 体验windows vista图标设计功能
上一篇:vista显存需求有大学问 intel老大将不保 >>
在.net中利用委托实现窗体间通信
如果我们想在一个窗体中访问另一个窗体中自定义的成员,必须把该成员的可见性设置为Public或者通过属性公开,通过属性公开的话还说得过去,但如果把可见性设置成Public的,这样做就无可避免的破坏了类型封装性的原则,而这一做法也是我们在.NET下开发相当乐意做的,特别是对于初次接触.NET的开发人员,实现访问另一类型中成员的话最先想到的就是把该成员的可见性设置为Public,当然这样做算不上是错误,但把这一做法作为自己的首要灵感,至少从面向对象的角度出发显然是不合适的。
在.NET下,还为我们提供了另外一种强大的机制来实现窗体通信,这就是委托。委托可理解为一种类型安全的函数指针,.NET下的事件的实现都是以委托做为基础的。关于委托在这篇文章中我就不详细介绍了,后边会有文章专门介绍这一概念。 在此我演示通过在一个窗体里向另外一个窗体里的ListBox控件添加Item项来说明这一方法。因此需要两个窗体,一个MainFrm窗体,一个ChildFrm窗体,另外还需要一个Middle类,作为MainFrm和ChildFrm之间通信的桥梁。我也将给出VB.NET和C#两种语言的代码,以便大家可以做一下比较。
首先是MainFrm窗体,在MainFrm窗体中,拖一个ListBox控件即可,MainFrm.vb的代码如下(为简单起见,在此省去自动生成的代码):
| Public Class Form3 Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load AddHandler Middle.SendMessage, AddressOf DoMethod End Sub Private Sub DoMethod(ByVal getstr As String) Me.ListBox1.Items.Add(getstr) End Sub End Class |
再看ChildFrm窗体,在其中拖一个TextBox和一个Button控件,通过在TextBox中输入值后,按Button按钮向MainFrm窗体的ListBox控件中添加Item项。
| Public Class Form2 Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Middle.DoSendMessage(TextBox1.Text) TextBox1.Text = "" TextBox1.Focus() End Sub End Class |
最后看Middle类:
| Public Class Middle Public Shared Event SendMessage(ByVal str As String) Public Shared Sub DoSendMessage(ByVal str As String) RaiseEvent SendMessage(str) End Sub End Class |
为了更好的演示MainFrm和ChildFrm之间的独立性,修改一下Application.Designer.vb的代码:
| <Global.System.Diagnostics.DebuggerStepThroughAttribute()> Protected Overrides Sub OnCreateMainForm() Me.MainForm = Global.WindowsApplication3.MainFrm ChildFrm.show() End Sub |
好了,代码完了,是不是很简单?通过上面的代码可以看出来,通过Middle类,MainFrm和ChildFrm都和Middle类通信,它们之间除了参数的耦合外,已不再引用彼此的内部成员,这样就显得更加独立了。
下面是对应的C#代码,MainFrm.cs:
| public partial class MainFrm: Form { private void MainFrm _Load(object sender, EventArgs e) { Middle.sendEvent += new Middle.SendMessage(this.DoMethod); } public void DoMethod(string getstr) { listBox1.Items.Add(getstr); } } ChildFrm.cs: public partial class ChildFrm: Form { public ChildFrm () { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Middle.DoSendMessage(this.textBox1.Text); textBox1.Text = ""; textBox1.Focus(); } } Middle.cs: public static class Middle { public delegate void SendMessage(string str); public static event SendMessage sendEvent; public static void DoSendMessage(string str) { sendEvent(str); } } |
同样我们修改一下Program.cs的代码:
| static class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); // Application.Run(new Form1()); Form1 mainFrm = new Form1(); childFrm secondFrm = new childFrm(); secondFrm.Show(); Application.Run(mainFrm); } } |
比较上面的VB.NET和C#代码,我们可以看出VB.NET允许直接用Event关键字声明事件,而C#则必须由我们自己首先声明事件的委托原型,然后再基于该委托声明事件,从这点看来VB.NET显得更简洁,其实VB.NET编译器在背后会自动的为我们定义一个委托对象,而且该委托与C#代码声明的委托所生成IL代码是一样的,这点大家可以通过Ildasm中间代码查看器来查看一下。引发事件,VB.NET是通过RaiseEvent关键字加上事件名称,而C#则是通过直接使用事件名称;最后是绑定事件的代码,VB.NET是通过AddHandler关键字,C#通过重载的+=操作符,对于以上两点,编译器同样会为我们生成一致的IL代码。
当然,上面的例子比较简单,不过我们完全可以通过委托实现复杂的窗体通信,比如可以传递复杂的数据类型,同时,可以在设计结构更加良好的中间通信类。但也要提醒大家,不要动不动就要用委托,它会增加程序的复杂性,应该根据自己的需求考虑用何种方法。
| 软件频道精品推荐 | |||
|
更多精彩 | |||
下一篇:抛弃win xp!细数升级vista的五大理由 >>
相关文章:
- · .Net Framework 2.0范型的反射使用
- · 基于VS.NET的自定项目模板研究
- · 详测:win vista beta1对p2p兼容极差
- · .NET下基于组件的分布式系统动态配置
- · 利用数据绑定和模板创建Atlas应用程序
- · 为.NET程序批上WPF的绚丽外衣
- · VS2005中文输入法自动转换的解决方法
- · VS2005与SQL Server2005的整合优势
- · VS2005改善团队开发的人力负担与协调
- · VS2005让软件开发回归软件工程
- · .NET2.0泛型的“近距离”实践
- · 基于VS.NET的自定项目模板研究
- · .NET Remoting构建分布式数据库查询
- · VS2005中用Code Snippets提高开发效率
- · 实现.NET应用程序的自动更新
- · 在.NET中使用命名管道完成进程间通信
- · 揭开.NET消息循环的神秘面纱
- · .NET设计模式研究之装饰模式
- · 浅谈CLR的内存分配和回收机制
- · .NET下的动态代码编译探索
- · 深入ASP.NET 2.0的提供者模型
- · ASP.NET 2.0编程小技巧两则
- · ASP.NET底层架构探索之进入ASP.NET
- · ASP.NET底层架构之从浏览器到ASP.NET
- · 商业周刊:即时通讯中暗藏的风险
- · 3ds max 7.5扩展版的新特色和新功能
- · 美国编程人员年薪同期增长8.7%为IT业最快
- · 金融时报:Web2.0成恶意代码的沃土
- · Web2.0时代,你得到什么?
- · 冯杰:Web2.0时代,你能得到什么?
- · 24日精选 个人网站站长常用网站推荐
- · 23日精选 Flash导航菜单轻松制作好帮手
- · 22日精选 QQ2006 Beta3开始内测
- · 21日精选 Web创业的十条戒律
- · 18日精选 AutoCAD阵列操作全攻略
- · 17日精选 Lava-Lava标签功能使用指南
- · 16日精选 穿透ADSL路由入侵内网另类伎俩
- · 15日精选 Linux下如何使用USB盘
