【问题标题】:Passing values between three forms in C# .NET在 C# .NET 中的三个表单之间传递值
【发布时间】:2011-02-18 07:02:23
【问题描述】:

我有一个 Windows 应用程序,它具有三种形式:Form1、2、3。

--Form 1,有两个按钮,openform2,openform3。 --Form2有一个文本框form2_textbox,和按钮form2_button --Form3有一个文本框form3_textbox

现在,单击 form1 上的按钮 openform2 时,Form2 打开,在 Form2 的文本框 form2_textbox 中输入一个字符串,现在当单击此表单的按钮 form2_button 时,我希望 Form1 接收此字符串值并将其存储在字符串接收来自form2, 然后将此字符串值显示到 Form3 的 form3_textbox 上。

请指导我如何完成这项任务?

【问题讨论】:

    标签: c# .net forms


    【解决方案1】:

    忽略它们是表单的事实。将它们视为任何其他对象——您将使用属性、方法、事件和构造函数。 GUI 控件有一些奇怪的地方,主要是在线程亲和性方面,但通常您应该对它们应用相同的面向对象方法,就像对其他任何东西一样。

    例如,当在 Form1 中构造 Form2 时,将事件处理程序添加到 Form2 中的按钮(通过在 Form2 中创建新事件或通过属性公开按钮并直接附加它)。事件处理程序会向 Form2 询问文本框中的文本,并在创建 Form3 时使用它。

    【讨论】:

    • @Jon Skeet,尊敬的先生,非常感谢您的回复,您能提供此代码吗?我还是一头雾水?
    • @sqlchild:恐怕我现在没有时间这样做。哪一点让你感到困惑?
    • @Jon Skeet,如何在 Form2 中创建事件处理程序?我已经创建了按钮点击事件,但是要写什么呢?
    • @sqlchild:我没有说要在 Form2 中创建事件 handler - 我说要么在 Form2 中创建 event,要么公开按钮通过一个属性,以便 Form1 可以直接订阅按钮的单击事件。请阅读我关于事件的文章以获取更多信息:csharpindepth.com/Articles/Chapter2/Events.aspx
    • @Jon Skeet,亲爱的先生,你能给我代码吗,我完全搞砸了,因为这个问题我坚持了 10 个小时,没有任何解决方案
    【解决方案2】:

    有几种方法可以做到这一点。使用 .NET 事件是其中之一,但需要非常耦合的布线。

    我的建议(这就是我这样做的方式)是使用您自己的总线(观察者模式)。我们称之为 MessageBus。你所有的表单都可以使用这个总线的同一个实例,当一些有趣的事情发生时你可以发布一些消息。我会保持强类型,但为了简单起见,我们这样说:

    public class Message<T> 
    { 
        public string Name { get; set; }
        public T Data { get; set; }
    }
    

    然后,您的总线上会有订阅者响应他们感兴趣的消息。

    public class MessageBus
    {
        public void Subscriber(ISubscriber subsriber)
        {
             // register your subscriber in some list
        }
    
        public void Publish(Message message)
        {
             // loop through subscribers and let them know
             // e.g. subscriber.Handle(message);
        }
    }
    

    因此,要将所有这些连接起来,每个想要发布事件的表单(例如您的 form2)都需要对消息总线的引用,并且每个对接收事件感兴趣的对象(例如 form3)都将注册为订阅者。

    这与使用 .NET 事件的唯一区别是各种发布者和订阅者不需要相互了解,因此它们是松散耦合的——他们只需要了解总线。使用 .NET 事件可以获得相同的松散耦合,但这需要花很多功夫。

    我想不止一种给猫剥皮的方法。

    我的复合 ui 框架中有一个更成熟的实现,用于我们的 FOSS 服务总线上的工具。有兴趣的可以看看:

    Shuttle Service Bus on CodePlex

    如果您下载源代码,您会在 Shuttle.Core.UI 项目中找到它。

    希望它有意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      相关资源
      最近更新 更多