转载自《c# 在WinForm 窗体间传递信息》http://blog.sina.com.cn/s/blog_45eaa01a01014552.html,我转换为VB.net,并在方法6中讲述如何从主窗口传递信息到子窗口。
方法1
在Form1中通过PostMessage发送消息,在Form2通过DefWndProc截获消息来相互作用,具体参见我先前的文章《C# 收发和处理自定义的WINDOWS消息》
方法2
通过第三方 公共类的公共静态成员来实现
Class class1
Public Shared str As String
'公用字符串
End Class
在Form1中赋值class1.str="传入的内容"; ,在Form2中使用,string s=class1.str; 这样的方式可以传递任何的对象,比如数组等。
以下的内容来自网上,我更改其中的错误,并加以简化。
方法3
主窗体将自己的this引用,传递给子窗体的构造函数。代码如下:
主窗体
Private Sub button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim f1 As New Form1(Me)
f1.Show()
End Sub
子窗体
Public Partial Class Form1
Inherits Form
Private mForm As frmMain
Public Sub New(f As frmMain)
Me.mForm = f
InitializeComponent()
End Sub
Private Sub button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
mForm.Text = "1 通过 指针 传递信息"
End Sub
End Class
方法4
为了限制主窗体暴露给子窗体的功能,使用接口。代码如下:
定义接口
Public Interface IChangeTitle
Sub ChangeTitle(title As String)
End Interface
主窗体
Inherits System.Windows.Forms.Form
Implements IChangeTitle
Public Sub ChangeTitle(title As String) Implements IChangeTitle.ChangeTitle
Me.Text = title
End Sub
Private Sub button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim f2 As New Form2(Me)
f2.Show()
End Sub
子窗体
Public Partial Class Form2
Inherits Form
Private ichangeTitle As IChangeTitle
Public Sub New(ichangeTitle As IChangeTitle)
InitializeComponent()
Me.ichangeTitle = ichangeTitle
End Sub
Private Sub button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
' 通过接口来调用方法
ichangeTitle.ChangeTitle("2 通过 接口 传递信息")
End Sub
End Class
方法5
为了进一步降低窗体之间的耦合度,利用委托。代码如下:
主窗体
Protected Sub FormTitleChanged(title As String)
Me.Text = title
End Sub
Private Sub button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Dim f3 As New Form3()
f3.TitleChanged = New Form3.TitleChangedHandler(AddressOf FormTitleChanged)
f3.Show()
End Sub
子窗体
Public Partial Class Form3
Inherits Form
' 声明和定义委托
Public Delegate Sub TitleChangedHandler(title As String)
Public TitleChanged As TitleChangedHandler
Public Sub New()
InitializeComponent()
End Sub
Private Sub button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
RaiseEvent TitleChanged("3 通过 委托代理 传递信息")
'委托调用
End Sub
End Class
方法6
更好是,在子窗体中定义一个自定义事件及其事件参数。代码如下:
主窗体
Protected Sub FormTitleChanged(sender As Object, e As Form4.TitleChangedEventArgs)
Me.Text = e.Title
End Sub
Private Sub button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
Dim f4 As New Form4()
AddHandler f4.TitleChanged , New Form4.TitleChangedEventHandler(AddressOf FormTitleChanged)
f4.Show() ' 主窗体订阅子窗体事件TitleChanged就可以了
End Sub
子窗体
Public Partial Class Form4
Inherits Form
Public Class TitleChangedEventArgs
Inherits EventArgs
' 事件参数类
Private m_title As String = ""
Public Property Title() As String
Get
Return m_title
End Get
Set
m_title = value
End Set
End Property
End Class
' 声明委托
Public Delegate Sub TitleChangedEventHandler(sender As Object, e As TitleChangedEventArgs)
' 定义事件
Public Event TitleChanged As TitleChangedEventHandler
Public Sub New()
InitializeComponent()
End Sub
Private Sub button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim e1 As New TitleChangedEventArgs()
e1.Title = "4 通过 触发事件 传递信息"
OnTitleChanged(e1)
' 触发事件
End Sub
' 触发事件的方法
Protected Overridable Sub OnTitleChanged(e As TitleChangedEventArgs)
RaiseEvent TitleChanged(Me, e)
End Sub
End Class
以上的都是子窗口传递信息到父窗口。
下面将上面的代码修改下,实现父窗口传递信息到子窗口,只选方法6修改如下:
主窗体
' 子窗体订阅主窗体事件TitleChanged就可以了
Public Partial Class Form1
Inherits Form
Public Class TitleChangedEventArgs
Inherits EventArgs
' 事件参数类
Private m_title As String = ""
Public Property Title() As String
Get
Return m_title
End Get
Set
m_title = value
End Set
End Property
End Class
' 声明委托
Public Delegate Sub TitleChangedEventHandler(sender As Object, e As TitleChangedEventArgs)
' 定义事件
Public Event TitleChanged As TitleChangedEventHandler
Public Sub New()
InitializeComponent()
End Sub
Private Sub button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim e1 As New TitleChangedEventArgs()
e1.Title = "5 通过 触发事件 由父窗口传递信息到子窗口"
OnTitleChanged(e1)
' 触发事件
End Sub
' 触发事件的方法
Protected Overridable Sub OnTitleChanged(e As TitleChangedEventArgs)
RaiseEvent TitleChanged(Me, e)
End Sub
Private Sub button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim f4 As Form4= New Form4()
' 子窗体订阅主窗体事件TitleChanged就可以了
AddHandler me.TitleChanged , New TitleChangedEventHandler(AddressOf F4.FormTitleChanged)
f4.Show()
End Sub
End Class
子窗体
Public Sub FormTitleChanged(sender As Object, e As Form1.TitleChangedEventArgs)
Me.Text = e.Title
End Sub