唐山网站建设

设为主页 加入收藏 繁體中文

在.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:方法,事件,代码,通讯,窗体
评论加载中...
内容:
评论者: 验证码: