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的代碼:
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();
}
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代碼。