c# 在WinForm 窗体间传递信息(转换为VB.net)

转载自《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





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值