在.NET中利用拜托实现窗体间通讯
核心提示:对窗体间简单的通讯,采取VB6.0的方法便可以满足我们的要求,但在1些架构设计复杂的利用中,这类方法就显得有点捉襟见肘了,同时该方法还有1个缺点,就是它仅仅对通过。NET窗体向导添加进往的窗体起作用...
对窗体间简单的通讯,采取VB6.0的方法便可以满足我们的要求,但在1些架构设计复杂的利用中,这类方法就显得有点捉襟见肘了,同时该方法还有1个缺点,就是它仅仅对通过。NET窗体向导添加进往的窗体起作用。
而对自定义的窗体类型我们是没法添加到Forms对象集合中的。而且也和其它诸如构造函数传参等方法1样,会在窗体间大量相互援用各自的成员,造成了彼此之间存在着很大的耦合性,非常不利于窗体模块间的独立,这不符合良好软件设计模式的思想。
假设我们想在1个窗体中访问另1个窗体中自定义的成员,必须把该成员的可见性设置为Public或通过属性公然,通过属性公然的话还说得过往,但假设把可见性设置成Public的,这样做就无可避免的破坏了类型封装性的原则,而这1做法也是我们在。NET下开发相当乐意做的,特别是对初次接触。NET的开发职员,实现访问另1类型中成员的话最早想到的就是把该成员的可见性设置为Public,固然这样做算不上是毛病,但把这1做法作为自己的重要灵感,最少从面向对象的角度动身明显是分歧适的。
在。NET下,还为我们提供了另外1种强大的机制来实现窗体通讯,这就是拜托。拜托可理解为1种类型安全的函数指针,。NET下的事件的实现都是以拜托做为基础的。关于拜托在这篇文章中我就不具体先容了,后边会有文章专门先容这1概念。 在此我演示通过在1个窗体里向另外1个窗体里的ListBox控件添加Item项来讲明这1方法。因此需要两个窗体,1个MainFrm窗体,1个ChildFrm窗体,另外还需要1个Middle类,作为MainFrm和ChildFrm之间通讯的桥梁。我也将给出VB.NET和C#两种语言的代码,以便大家可以做1下比较。
首先是MainFrm窗体,在MainFrm窗体中,拖1个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窗体,在其中拖1个TextBox和1个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之间的独立性,修改1下Application.Designer.vb的代码: Protected Overrides Sub OnCreateMainForm() Me.MainForm = Global.WindowsApplication3.MainFrm ChildFrm.show() End Sub |
好了,代码完了,是否是很简单?通过上面的代码可以看出来,通过Middle类,MainFrm和ChildFrm都和Middle类通讯,它们之间除参数的耦合外,已不再援用彼此的内部成员,这样就显得更加独立了。
1 2 下1页
核心提示:对窗体间简单的通讯,采取VB6.0的方法便可以满足我们的要求,但在1些架构设计复杂的利用中,这类方法就显得有点捉襟见肘了,同时该方法还有1个缺点,就是它仅仅对通过。NET窗体向导添加进往的窗体起作用...
下面是对应的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); } } |
一样我们修改1下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编译器在背后会自动的为我们定义1个拜托对象,而且该拜托与C#代码声明的拜托所天生IL代码是1样的,这点大家可以通过Ildasm中间代码查看器来查看1下。引发事件,VB.NET是通过RaiseEvent关键字加上事件名称,而C#则是通过直接使用事件名称;最后是绑定事件的代码,VB.NET是通过AddHandler关键字,C#通太重载的+=操纵符,对以上两点,编译器一样会为我们天生1致的IL代码。
固然,上面的例子比较简单,不过我们完全可以通过拜托实现复杂的窗体通讯,比如可以传递复杂的数据类型,同时,可以在设计结构更加良好的中间通讯类。但也要提示大家,不要动不动就要用拜托,它会增加程序的复杂性,应当根据自己的需求考虑用何种方法。进进讨论组讨论。
上1页 1 2 http://www.fw8.net/TAG:方法,事件,代码,通讯,窗体
评论加载中...
|