【问题标题】:Best practice to pass information between windows.forms在 windows.forms 之间传递信息的最佳实践
【发布时间】:2008-10-08 18:04:00
【问题描述】:

您如何在表单之间传递信息? Forward 是直接使用 Properties 或者可能是 New() 或 DoStuff() 方法中的参数,但是当用户完成后发送一些东西 back 呢?第二种形式? (IE.所选项目的ID)我们已经使用了所有这些:

  • 将调用表单作为引用传递给被调用表单,以便被调用表单可以访问调用表单上的属性或方法。我真的不喜欢这样,因为这两种形式非常相互依赖。将调用表单作为对象传递只会稍微改善这一点。
  • 使用事件这在某种程度上解耦了代码,但签名必须与事件处理程序匹配。
  • 使用公共接口 我说的是内置的 .NET,但我想您可以创建自己的。这对我来说似乎是最好的。

现在提高标准,如果表单位于两个不同的 DLL 中怎么办?只要表单不相互依赖,我认为这不会是一大步。

【问题讨论】:

    标签: .net winforms


    【解决方案1】:

    为表单创建公共属性,然后等待表单关闭并检查属性,然后再释放新表单。

    NewForm myForm = new NewForm();
    myForm.ShowDialog();
    string x = myform.MyProperty;
    

    【讨论】:

      【解决方案2】:

      我发现,一旦您拥有一个设计良好的域实体对象模型,或者仅仅是业务对象。这些任务变得容易得多。

      如果您没有 Employee、Account、Location 等域实体,您会发现自己在编写具有大量属性的表单并创建大量尴尬的依赖项。随着时间的推移,这可能会变得非常混乱。

      一旦有了域实体,处理起来就容易多了。例如,要使用表单编辑您的 Employee,您可以简单地创建一个 Employee 属性,如下所示:

      NewForm myForm = new NewForm();             
      myForm.Employee = employeeToEdit; // This can have state 
      myForm.ShowDialog(); 
      Employee editedEmployee= myform.Employee;
      
      EmployeeFacade.SaveEmployee(editedEmployee); // Or whatever
      

      关于事件,对于 Winform/WPF 应用程序,使用发布/订阅模式创建一个全局 EventManager 来处理表单之间的通信几乎没有帮助。我很少有一种形式直接与任何其他形式“交谈”。那是另一个话题,所以我不会详细介绍,如果您需要示例,我可以提供我做过的几个。

      雷福德布鲁克郡

      【讨论】:

        【解决方案3】:

        如果是一个主窗体创建另一个窗体的实例,等待窗体完成一些工作然后关闭,并检查它的结果,那么拥有公共属性或监听事件是最有意义的。将表单放在不同的程序集中都不会影响这些事情。您确实在两种表单之间获得了明确的约束契约,但如果属性是在公共接口中描述的(如您所建议的),那么只要每个人都同意接口的条款,您就很好。

        我不确定您希望它变得多复杂。过去,我使用静态单例对象来保存应用程序状态。 app-state 对象将公开程序的其他部分可以侦听的事件处理程序。主窗体将创建应用程序状态(实际上只是获取对它的引用)并监听其上的某些事件。然后主窗体将创建子窗体和控件来完成工作。孩子们会改变 app-state 对象的属性,这反过来会触发主窗体将监听的事件。通过这种方式,各种表单和控件彼此分离。缺点是它们与应用状态单例紧密耦合。

        【讨论】:

          【解决方案4】:

          我成功做的一件事是在应用程序中创建了一个轻量级的发布/订阅事件系统。这是在 .net 1.1 中,不确定它会如何随着泛型而改变。本质上,我们有一个单例,其中包含一个带有字符串键的哈希表和多播委托。

          单例有 RegisterForEvent(string key, delegate handler), RaiseEvent(key,data) 等方法...

          然后我们定义了一个标准委托,并说所有用户都必须实现这种模式,例如我们的处理程序必须是:void method(object sender, CustomEventArgs args)。发布者将定义他们自己的 CustomEventArgs 派生类。

          好消息是这允许构建一个完全解耦的系统。我们有很多程序集,没有任何问题,只需要确保您的 eventargs 定义在其他潜艇可以获取的位置。

          我们有我们所谓的不同子系统,例如我们有一个监控互联网连接的子系统,当它引发事件时,UI 会更改以指示它们的连接状态,我们还有一个排队服务,可以将消息发布到服务器,当它看到连接断开时,我们将停止发布。

          缺点是它的耦合非常松散,至少我们的实现是这样,但有一些方法可以改进。

          【讨论】:

            【解决方案5】:

            您想访问第二种形式的 UI 元素吗?我认为更简洁的方法是使用共享对象将数据传递回调用表单。将对象作为参数传递给第二个表单构造函数,该构造函数可以填充实例字段并将该实例返回给调用表单。如果需要,此对象还可以引发任何事件(如属性更改事件)以通知调用表单(或订阅者)。

            【讨论】:

              【解决方案6】:

              this.Hide(); 字符串[]名称=新字符串[]; new frmFormName = new frm(string what, string you, string going, string to, string put, 搅拌); this.ShowDialog(); this.Show();

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2023-03-30
                • 2011-03-13
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-11-20
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多