第二个窗体关闭时向第一个窗体传值

6lilu9 工程师  2017-12-06 03:16:51
这是一个讨论贴,关于“如何在两个窗体之间传送数据”,想达到一个效果:如何在一个窗体中打开另一个窗体,并在第二个窗体关闭时向第一个窗体传值。
在网上查找到这么一个解决方案,说实话,我没看懂(不好意思,我都怀疑可行性),http://bbs.csdn.net/topics/190041664
于是自已想了一个办法,但于步骤3访问了 form1的控件属性,我不太满意。

实现步骤:
1 、form1中通过函数调用form2中的函数
2、form2中各种折腾,改变SS的值
3、form2关闭时,将值传送给form1中控件TextBox1。

哪有高手能指点一下?

简化代码:
form1中
    Public KeyCode As String
'为记事提供关键字
Private Sub LabelX1_Click(sender As Object, e As EventArgs) Handles LabelX1.Click,
ThingsCode.MainTr()
End Sub

FORM2中
Public Class  form2
Private ss As String
'主函数
Public Sub MainTr(i As String)
Me.Show()
End Sub

'主代码
Private Sub CheckBox6_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged, _
CheckBox2.CheckedChanged, CheckBox3.CheckedChanged, CheckBox4.CheckedChanged, CheckBox5.CheckedChanged, _
CheckBox6.CheckedChanged, CheckBox7.CheckedChanged, CheckBox8.CheckedChanged, CheckBox9.CheckedChanged, CheckBox10.CheckedChanged

Dim S As String = sender.text
Dim l As Integer = InStr(S, ":") + InStr(S, ":")
Dim T As String = S.Substring(0, l)

ss = ss & T

End Sub

'返还数据
Private Sub form2_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
Form1.Controls("TextBox1").Text = ss
End Sub

End Class
...全文
612 18 点赞 打赏 收藏 举报
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
FainSheeg 2017-12-07
引用 14 楼 sp1234 的回复:
[quote=引用 11 楼 yangliu0512 的回复:] 能否推荐一下关于设计模式,设计原则方面的书?本人纯自学业余爱好者,因为经常学习练习加思考,对于面向对象的编程自觉理解还算可以。最近在尝试写一些复杂点的系统,半吊子出身的缺点就出来了,感觉有点乱,就是因为缺少规范和原则。希望大神赐教。
我说说的“设计模式”是指软件设计和中最基本最常见的套路,是比较基础的 OOPL 技术伎俩的意思,并不是指 GOF(四人帮)为主要代表的那种书籍。它其实就是指你在一个比较专业一点的公司里每天都能听到、每天都要写的文档的模板的意思。而 GOF 的设计模式的书其实离 OOAD 软件设计工程的距离很远,我建议你学习面向对象系统分析、设计的专业教材,不要仅仅看那些“设计模式”为名的文章和书籍。我说的设计模式这个词儿主要是指常见的工厂经验,因此主要靠你自己平常积累和分享所得,而不是指某本书上的东西。[/quote] 好吧,原来是经验性的东西,我还以为计算机系的专业课程就会教的东西呢。我不是在软件公司工作,工作内容更跟写代码一点关系都没有,所以也听不到看不到这引些东西,论坛里也只看到你会经常说说这类经验。还是得靠自己悟啊
  • 打赏
  • 举报
回复
我说的设计模式这个词儿主要是指常见的工厂经验 --> 我说的设计模式这个词儿主要是指常见的工作中的经验
  • 打赏
  • 举报
回复
引用 11 楼 yangliu0512 的回复:
能否推荐一下关于设计模式,设计原则方面的书?本人纯自学业余爱好者,因为经常学习练习加思考,对于面向对象的编程自觉理解还算可以。最近在尝试写一些复杂点的系统,半吊子出身的缺点就出来了,感觉有点乱,就是因为缺少规范和原则。希望大神赐教。
我说说的“设计模式”是指软件设计和中最基本最常见的套路,是比较基础的 OOPL 技术伎俩的意思,并不是指 GOF(四人帮)为主要代表的那种书籍。它其实就是指你在一个比较专业一点的公司里每天都能听到、每天都要写的文档的模板的意思。而 GOF 的设计模式的书其实离 OOAD 软件设计工程的距离很远,我建议你学习面向对象系统分析、设计的专业教材,不要仅仅看那些“设计模式”为名的文章和书籍。我说的设计模式这个词儿主要是指常见的工厂经验,因此主要靠你自己平常积累和分享所得,而不是指某本书上的东西。
  • 打赏
  • 举报
回复
FainSheeg 2017-12-07
引用 12 楼 sp1234 的回复:
在早期的一些 java 设计模式的作者那里,其实他们不懂什么是事件,因此才会把原本很简单的一个东西研究成好几个接口模式。实际上如果知道事件设计,那么根本不用那么多模式。事件机制是最重要的设计知识。假设不同对象之间的关联依赖需要倒置时,总是搞不清楚某些复杂操作的职责是谁来承担,甚至空洞地强调出一大堆“抽象、具体、接口”等等术语也不能很好地反转设计依赖关系时,这就要扔掉什么设计模式概念,你直接用“事件”这个名词儿,直接理解 .net(以及20~30年来微软的面向界面的设计工具中一直就有事件概念)比设计模式名词儿好用多了。
事件机制我是明白的,包括我自己设计 的一些自定义类里,我也经常会定义一些私有或公共的事件以方便使用。但是如您在7楼中的例子,因为不懂得职责和依赖的原则,所以我想不到应该在form1中动态添加句柄来响应form2的关闭事件。
引用 7 楼 sp1234 的回复:
模式的问题,体现着“职责分配”的策略问题。只有 form1 依赖 form2,所以显示在 TextBox1 什么结果,那根本不是 form2 的事儿!应该写
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim f As New Form2
        AddHandler f.FormClosed, Sub()
                                     Me.TextBox1.Text = f.Result
                                 End Sub
        f.Show()
    End Sub
End Class
这才是职责所在,而不是什么 form2 中去写这些代码。 先分清楚职责,是设计程序的一个非常重要的基础步骤。
如果同样的需求让我来设计,我肯定会写成如4楼我回答的那样:
引用 4 楼 yangliu0512 的回复:
form1中自定义一个公共只读属性: public writeonly property text1 as string set(Value as string) textbox1.text=Value end set end property form2中调用:form1.text1=ss
定义一个属性,然后在form2关闭事件中来修改。
  • 打赏
  • 举报
回复
在早期的一些 java 设计模式的作者那里,其实他们不懂什么是事件,因此才会把原本很简单的一个东西研究成好几个接口模式。实际上如果知道事件设计,那么根本不用那么多模式。事件机制是最重要的设计知识。假设不同对象之间的关联依赖需要倒置时,总是搞不清楚某些复杂操作的职责是谁来承担,甚至空洞地强调出一大堆“抽象、具体、接口”等等术语也不能很好地反转设计依赖关系时,这就要扔掉什么设计模式概念,你直接用“事件”这个名词儿,直接理解 .net(以及20~30年来微软的面向界面的设计工具中一直就有事件概念)比设计模式名词儿好用多了。
  • 打赏
  • 举报
回复
FainSheeg 2017-12-07
引用 9 楼 以专业开发人员为伍的回复:
如果你学习“依赖倒置原则”,我觉得在翻译解释依赖倒置原则时有2个容易被误导的说法,这两个问题重新理解才会比较方便地使用这个原则: 1. 许多翻译解释都说“高层模块A不应该依赖低层模块B”,这是最容易引起误解的,让人乍一看似乎是说继承关系呢。其实你自己看随后的那些具体说明,A与B根本没有继承关系,而是简单的关联。所以把他们之间的关系说成是“客户-服务”关系菜更加恰当,“服务不应该依赖客户,客户应该依赖服务”,避免把这个原则所涉及的关系说成是什么“层次”关系。 2. 许多文章说“二者都应该依赖其抽象”,我认为这已经是相当过分的要求了,这让绝大多数直截了当的设计变得空洞。实际上仅当“模拟自然领域结构的”情况下,仅当A不能依赖B、B也不能依赖A的时候,才需要考虑中间组件。而一方完全可以当作另一方的服务,那么就应该直截了当地允许一方依赖另一方。过分抽象绝对有害。所以,假设小车的姿态控制依赖于四个轮子的传感器,那么我们就把这种传感器定义为服务,小车监听传感器的事件,而传感器不会再去依赖于小车,能把依赖倒置原则设计为“客户-服务”架构就足够灵活实用了。而当我们需要反馈控制时,小车会把指令直接给传感器,而不是搞什么空洞的中间抽象层。 因此,理解依赖倒置原则时,需要注意这两个非常容易走偏的问题。
能否推荐一下关于设计模式,设计原则方面的书?本人纯自学业余爱好者,因为经常学习练习加思考,对于面向对象的编程自觉理解还算可以。最近在尝试写一些复杂点的系统,半吊子出身的缺点就出来了,感觉有点乱,就是因为缺少规范和原则。希望大神赐教。
  • 打赏
  • 举报
回复
form2 并不依赖于 form1,相反地,form2设计了事件机制来通知所有的宿主,这是很好的依赖倒置的体现。这里的接口就体现在是form2创建了事件定义,form2用自己的接口来进行事件通知,而不是 form2去用别人的接口来进行通知。 假设有人说“form1设计个接口然后form2依赖这个接口,form2设计个接口然后form1依赖这个接口”,其实这就根本不是有效率的、实用的解耦方式,仅仅搞个名词儿包装也是“令人非常不满意”的。所以网上许多人说的“高层类依赖于对底层类的抽象,低层类也依赖于抽象”不但没有真正解耦,反而是更加麻烦的用抽象来绕来绕去,并没有解耦。
  • 打赏
  • 举报
回复
6lilu9 2017-12-07
引用 17 楼 lengyeshuang 的回复:
[quote=引用 6 楼 sp1234 的回复:] 给你写个例子吧: ...... 这里,当点击form1上的按钮时,打开 form2窗口;然后当form2关闭时,form1获得form2输出的result值。这里的关键在于设计模式,form2绝不依赖于form1,这是符合设计模式要求的。
我笨,看不懂呀。 我的form2不是打开就关闭,比如我要改变result的值,怎么操作呢? 以下代码: ..... 我期望的结果是:打开form2,经过一系列的操作(就是点击了button1),传给result的数值会改变呀。如果不能改变,就只是传送form2的默认值,这一切也就没什么意义了,不是吗?[/quote] 2B了
Public Class Form2

    Dim SS As String = "1576"
    Public Property Result() As String
        Get
            Return SS
        End Get
        Set(value As String)
            SS = value
        End Set
    End Property

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Me.Result = "改变过了"
    End Sub
End Class
其实我试了试,不用属性,用成员变量也可以,如下:
Public Class Form2

    Public Result As String = "1576"

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Result = "改变过了"
    End Sub
End Class
  • 打赏
  • 举报
回复
如果你学习“依赖倒置原则”,我觉得在翻译解释依赖倒置原则时有2个容易被误导的说法,这两个问题重新理解才会比较方便地使用这个原则: 1. 许多翻译解释都说“高层模块A不应该依赖低层模块B”,这是最容易引起误解的,让人乍一看似乎是说继承关系呢。其实你自己看随后的那些具体说明,A与B根本没有继承关系,而是简单的关联。所以把他们之间的关系说成是“客户-服务”关系菜更加恰当,“服务不应该依赖客户,客户应该依赖服务”,避免把这个原则所涉及的关系说成是什么“层次”关系。 2. 许多文章说“二者都应该依赖其抽象”,我认为这已经是相当过分的要求了,这让绝大多数直截了当的设计变得空洞。实际上仅当“模拟自然领域结构的”情况下,仅当A不能依赖B、B也不能依赖A的时候,才需要考虑中间组件。而一方完全可以当作另一方的服务,那么就应该直截了当地允许一方依赖另一方。过分抽象绝对有害。所以,假设小车的姿态控制依赖于四个轮子的传感器,那么我们就把这种传感器定义为服务,小车监听传感器的事件,而传感器不会再去依赖于小车,能把依赖倒置原则设计为“客户-服务”架构就足够灵活实用了。而当我们需要反馈控制时,小车会把指令直接给传感器,而不是搞什么空洞的中间抽象层。 因此,理解依赖倒置原则时,需要注意这两个非常容易走偏的问题。
  • 打赏
  • 举报
回复
FainSheeg 2017-12-07
引用 7 楼 以专业开发人员为伍的回复:
模式的问题,体现着“职责分配”的策略问题。只有 form1 依赖 form2,所以显示在 TextBox1 什么结果,那根本不是 form2 的事儿!应该写
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim f As New Form2
        AddHandler f.FormClosed, Sub()
                                     Me.TextBox1.Text = f.Result
                                 End Sub
        f.Show()
    End Sub
End Class
这才是职责所在,而不是什么 form2 中去写这些代码。 先分清楚职责,是设计程序的一个非常重要的基础步骤。
学习了
  • 打赏
  • 举报
回复
6lilu9 2017-12-07
引用 6 楼 sp1234 的回复:
给你写个例子吧: ...... 这里,当点击form1上的按钮时,打开 form2窗口;然后当form2关闭时,form1获得form2输出的result值。这里的关键在于设计模式,form2绝不依赖于form1,这是符合设计模式要求的。
我笨,看不懂呀。 我的form2不是打开就关闭,比如我要改变result的值,怎么操作呢? 以下代码: form1:
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim f As New Form2
        AddHandler f.FormClosed, Sub()
                                     Dim r = f.Result
                                     MessageBox.Show("结果是" + r)
                                 End Sub
        f.Show()
    End Sub
End Class
form2:
Public Class Form2

    Public Property Result() As String
        Get
            Return "Adfafa"
        End Get
        Set(value As String)
            '.......
        End Set
    End Property

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Me.Result = "改变过了"
    End Sub
End Class
我期望的结果是:打开form2,经过一系列的操作(就是点击了button1),传给result的数值会改变呀。如果不能改变,就只是传送form2的默认值,这一切也就没什么意义了,不是吗?
  • 打赏
  • 举报
回复
模式的问题,体现着“职责分配”的策略问题。只有 form1 依赖 form2,所以显示在 TextBox1 什么结果,那根本不是 form2 的事儿!应该写
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim f As New Form2
        AddHandler f.FormClosed, Sub()
                                     Me.TextBox1.Text = f.Result
                                 End Sub
        f.Show()
    End Sub
End Class
这才是职责所在,而不是什么 form2 中去写这些代码。 先分清楚职责,是设计程序的一个非常重要的基础步骤。
  • 打赏
  • 举报
回复
给你写个例子吧: form1
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim f As New Form2
        AddHandler f.FormClosed, Sub()
                                     Dim r = f.Result
                                     MessageBox.Show("结果是" + r)
                                 End Sub
        f.Show()
    End Sub
End Class
form2
Public Class Form2

    Public Property Result() As String
        Get
            Return "Adfafa"
        End Get
        Set(value As String)
            '.......
        End Set
    End Property

End Class
这里,当点击form1上的按钮时,打开 form2窗口;然后当form2关闭时,form1获得form2输出的result值。这里的关键在于设计模式,form2绝不依赖于form1,这是符合设计模式要求的。
  • 打赏
  • 举报
回复
引用 楼主 lengyeshuang 的回复:
这是一个讨论贴,关于“如何在两个窗体之间传送数据”,想达到一个效果:如何在一个窗体中打开另一个窗体,并在第二个窗体关闭时向第一个窗体传值。 在网上查找到这么一个解决方案,说实话,我没看懂(不好意思,我都怀疑可行性),http://bbs.csdn.net/topics/190041664 于是自已想了一个办法,但于步骤3访问了 form1的控件属性,我不太满意。 实现步骤: 1 、form1中通过函数调用form2中的函数 2、form2中各种折腾,改变SS的值 3、form2关闭时,将值传送给form1中控件TextBox1。
面向对象设计有5条基本原则,其中一条就是“依赖倒置”原则,简单说就是,form1 依赖form2,那么 form2就不要依赖 form1,这样形成“客户-服务”架构才能保持低耦合。当form2关闭的时候,抛出了 closed 事件,自然form1捕获事件去读取form2所要暴露出来的数据属性。这里绝不说什么“form2将值传给form1”,这样才体现了form2的灵活方便地重用为服务组件的可扩展性。
  • 打赏
  • 举报
回复
FainSheeg 2017-12-06
form1中自定义一个公共只读属性: public writeonly property text1 as string set(Value as string) textbox1.text=Value end set end property form2中调用:form1.text1=ss
  • 打赏
  • 举报
回复
groundsky 2017-12-06
可在第一个窗体中定义一个shared 变量 public shared v1 as object .赋值给该变量 即可
  • 打赏
  • 举报
回复
form1公开一个方法,将你赋值box的过程封装到这个方法里
  • 打赏
  • 举报
回复
正怒月神 2017-12-06
使用委托。
  • 打赏
  • 举报
回复
相关推荐
发帖
VB
加入

1.6w+

社区成员

VB技术相关讨论,主要为经典vb,即VB6.0
申请成为版主
帖子事件
创建了帖子
2017-12-06 03:16
社区公告
暂无公告