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

来源:互联网 发布:js post方式下载文件 编辑:程序博客网 时间:2024/04/30 20:39

转载自《c# 在WinForm 窗体间传递信息》http://blog.sina.com.cn/s/blog_45eaa01a01014552.html,我转换为VB.net,并在方法6中讲述如何从主窗口传递信息到子窗口。

方法1
在Form1中通过PostMessage发送消息,在Form2通过DefWndProc截获消息来相互作用,具体参见我先前的文章《C# 收发和处理自定义的WINDOWS消息》

方法2
通过第三方 公共类的公共静态成员来实现

Class class1Public 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.ClickDim f1 As New Form1(Me)f1.Show()End Sub

子窗体

Public Partial Class Form1Inherits FormPrivate mForm As frmMainPublic Sub New(f As frmMain)Me.mForm = fInitializeComponent()End SubPrivate Sub button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickmForm.Text = "1 通过 指针 传递信息"End SubEnd Class
方法4

为了限制主窗体暴露给子窗体的功能,使用接口。代码如下:

定义接口

Public Interface IChangeTitleSub ChangeTitle(title As String)End Interface

主窗体

Inherits System.Windows.Forms.Form    Implements IChangeTitle

Public Sub ChangeTitle(title As String) Implements IChangeTitle.ChangeTitleMe.Text = titleEnd SubPrivate Sub button2_Click(sender As Object, e As EventArgs) Handles Button2.ClickDim f2 As New Form2(Me)f2.Show()End Sub

子窗体

Public Partial Class Form2Inherits FormPrivate ichangeTitle As IChangeTitlePublic Sub New(ichangeTitle As IChangeTitle)InitializeComponent()Me.ichangeTitle = ichangeTitleEnd SubPrivate Sub button1_Click(sender As Object, e As EventArgs) Handles Button1.Click' 通过接口来调用方法ichangeTitle.ChangeTitle("2 通过 接口 传递信息")End SubEnd Class

方法5 

为了进一步降低窗体之间的耦合度,利用委托。代码如下:

主窗体

Protected Sub FormTitleChanged(title As String)Me.Text = titleEnd SubPrivate Sub button3_Click(sender As Object, e As EventArgs) Handles Button3.ClickDim f3 As New Form3()f3.TitleChanged = New Form3.TitleChangedHandler(AddressOf FormTitleChanged)f3.Show()End Sub
子窗体
Public Partial Class Form3Inherits Form' 声明和定义委托Public Delegate Sub TitleChangedHandler(title As String)Public TitleChanged As TitleChangedHandlerPublic Sub New()InitializeComponent()End SubPrivate Sub button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickRaiseEvent TitleChanged("3 通过 委托代理 传递信息")'委托调用End SubEnd Class

方法6

更好是,在子窗体中定义一个自定义事件及其事件参数。代码如下:

主窗体

Protected Sub FormTitleChanged(sender As Object, e As Form4.TitleChangedEventArgs)Me.Text = e.TitleEnd SubPrivate Sub button4_Click(sender As Object, e As EventArgs) Handles Button4.ClickDim f4 As New Form4()AddHandler f4.TitleChanged , New Form4.TitleChangedEventHandler(AddressOf FormTitleChanged)f4.Show() ' 主窗体订阅子窗体事件TitleChanged就可以了End Sub

子窗体

Public Partial Class Form4Inherits FormPublic Class TitleChangedEventArgsInherits EventArgs' 事件参数类Private m_title As String = ""Public Property Title() As StringGetReturn m_titleEnd GetSetm_title = valueEnd SetEnd PropertyEnd Class' 声明委托Public Delegate Sub TitleChangedEventHandler(sender As Object, e As TitleChangedEventArgs)' 定义事件Public Event TitleChanged As TitleChangedEventHandlerPublic Sub New()InitializeComponent()End SubPrivate Sub button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickDim e1 As New TitleChangedEventArgs()e1.Title = "4 通过 触发事件 传递信息"OnTitleChanged(e1)' 触发事件End Sub' 触发事件的方法Protected Overridable Sub OnTitleChanged(e As TitleChangedEventArgs)RaiseEvent TitleChanged(Me, e)End SubEnd Class

以上的都是子窗口传递信息到父窗口

下面将上面的代码修改下,实现父窗口传递信息到子窗口,只选方法6修改如下:

主窗体

' 子窗体订阅主窗体事件TitleChanged就可以了

Public Partial Class Form1Inherits FormPublic Class TitleChangedEventArgsInherits EventArgs' 事件参数类Private m_title As String = ""Public Property Title() As StringGetReturn m_titleEnd GetSetm_title = valueEnd SetEnd PropertyEnd Class' 声明委托Public Delegate Sub TitleChangedEventHandler(sender As Object, e As TitleChangedEventArgs)' 定义事件Public Event TitleChanged As TitleChangedEventHandlerPublic Sub New()InitializeComponent()End SubPrivate Sub button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickDim e1 As New TitleChangedEventArgs()e1.Title = "5 通过 触发事件 由父窗口传递信息到子窗口"OnTitleChanged(e1)' 触发事件End Sub' 触发事件的方法Protected Overridable Sub OnTitleChanged(e As TitleChangedEventArgs)RaiseEvent TitleChanged(Me, e)End SubPrivate Sub button2_Click(sender As Object, e As EventArgs)  Handles Button2.ClickDim f4 As Form4= New Form4()' 子窗体订阅主窗体事件TitleChanged就可以了AddHandler me.TitleChanged , New TitleChangedEventHandler(AddressOf F4.FormTitleChanged)f4.Show()End SubEnd Class

子窗体

Public Sub FormTitleChanged(sender As Object, e As Form1.TitleChangedEventArgs)Me.Text = e.TitleEnd Sub





0 0