【问题标题】:Handling multiple forms in C# app在 C# 应用程序中处理多个表单
【发布时间】:2009-12-10 17:33:36
【问题描述】:

我正在尝试修改使用多个表单的 C# WinForms 应用程序。启动时,将显示一个登录窗口。如果用户使用正确的用户名和密码组合登录,则具有三个不同选项卡的表单将显示为一种管理员视图。如果没有提供密码或用户名,将显示一个非常简化的 GUI。它基本上由两个按钮组成,根据按下的按钮依次显示这两种形式:

按钮 1:允许用户访问由多个文本框组成的表单,用户可以在其中输入将保存到数据库的信息。成功执行 DB 操作后,将再次显示第一个带有两个按钮的表单。

按钮 2:显示一个表单,用户可以在其中输入将写入 DB 的代码。 DB操作结束后,用户会自动回到原来的两个按钮的表单中。

这两种表单都有一个后退按钮,可以将用户带回到第一个表单。我有很多逻辑,但我不确定如何最好地处理所有涉及的表格。我应该在哪里实例化第一个(登录)表单?完成登录验证后,有两种可能的方法。显示选项卡式管理表单(如果用户名和密码正确)或带有两个大按钮的简化用户表单。还应该可以从管理表单中注销,以便显示简化的 GUI。

我希望我在这里说得通。我只需要一种很好的方法来处理它们之间的所有表单和导航。目前,实际上不需要在它们之间传输数据,但将来可能会成为一个问题,因此考虑到这一点的解决方案会非常好。

我认为真正需要的是一个从一开始就处理表单的显示和处理的类,但我不太确定应该将这个处理类的实例化放在哪里。

【问题讨论】:

  • 根据您对客户端的信任以及您的网络情况,您可能需要将数据库操作移至应用服务器,并在运行它们之前仔细检查凭据。

标签: c# .net winforms architecture


【解决方案1】:

我刚刚做了类似的事情。我有一组表单作为规范所称的“页面”进行管理。我也有严格的页面流程,比你的要复杂一些。我会告诉你的。

我将交互的每个“页面”设计为一个 UserControl,并创建了一个“OuterForm”和一个“Controller”。控制器有一个 Navigate(string pageName) 方法,外部窗体包含一个面板和一个 Display(Control page) 方法,该方法清除面板上的子项并添加替换。

我使用 Spring.NET 来配置控制器和表单,并使用 setter 注入在两者之间创建双向链接。这意味着我的主要方法可以向 Spring 请求表单并使用 Application.Run(form); 显示它;

我创建了一个方便的方法来从事件处理程序访问控制器,并且会做例如Controller.Instance.Navigate(chosenPage);控制器还使用 Spring.NET 为 selectedPage 加载正确的 UserControl,然后在主窗体上调用 Display() 它加载的实例。任何用户控件中都没有 Spring.NET 代码,也没有新关键字;-)

使用 Spring.NET 对我来说的好处是我有一个表单类,它只监视一些业务逻辑并显示进度指示。我能够实现一次并配置该表单的许多实例,并注入它将监视的不同业务逻辑。此外,我需要为特定领域的硬件和 Web 服务的接口存根。最终,我也将页面流移到了配置中。

【讨论】:

  • 听起来是一个非常干净和好的解决方案。我会保留它,看看我能想出什么。谢谢!
【解决方案2】:

表单管理可能是一个棘手的问题。有几种不同的方法:

  • 只需让表单在屏幕上浮动。让一些静态类保存对不同表单的引用并公开方法来激活它们。
  • 将表单实现为 ​​UserControls,将它们放在同一个表单上,并根据需要显示和隐藏控件(这也可以通过加载表单、剥离表单边框等并将其父级设置为面板或其他方式来实现类似;这几乎会使它们表现得像用户控件,但只是几乎)
  • 当然还有很多其他方法;o)

在管理登录表单时,我会在 Main 方法中执行此操作;显示登录表单,检查凭据,然后实例化您要显示的 UI 并将其传递给 Application.Run 方法。

【讨论】:

  • 确实有点棘手。 :) 一些我没有想到的好建议,谢谢。第一点似乎是一个非常合理的解决方案,因为我希望能够尽可能完整地保留我已经拥有的表单,而不必在这些表单中重写太多代码。
【解决方案3】:

您是否考虑过使用复合 UI 框架?在您的情况下,您可以将 WinForms 与 CAB 一起使用。

一大优势是支持基于角色的身份验证。经过身份验证的会话可以匹配一个角色,未经身份验证的会话可以匹配另一个角色。因此,您可以根据用户的角色显示不同的屏幕。

另一个优点是解决了谁负责实例化屏幕的问题。这是由控制器管理的,屏幕上的动作(例如按钮点击)可以向该控制器发送事件。

最后但同样重要的是,有一些很好的示例可用,并且肯定支持更高级的场景。

【讨论】:

  • 感谢您的提示。我会尽快调查 CAB。 :-)
猜你喜欢
  • 2013-05-14
  • 2017-07-29
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 2012-10-09
  • 1970-01-01
  • 2018-02-23
相关资源
最近更新 更多