在C#应用程序中处理多个表单

在C#应用程序中处理多个表单,c#,.net,winforms,architecture,C#,.net,Winforms,Architecture,我试图修改一个使用多个表单的C#WinForms应用程序。启动时,将显示一个登录窗口。如果用户使用正确的用户名和密码组合登录,则带有三个不同选项卡的表单将显示为一种管理员视图。如果没有提供密码或用户名,将显示一个非常简化的GUI。它基本上由两个按钮组成,根据按下的按钮依次显示这两种形式: 按钮1:允许用户访问由多个文本框组成的表单,用户可以在其中输入将保存到数据库中的信息。成功执行DB操作后,将再次显示带有两个按钮的第一个表单 按钮2:显示一个表单,用户可以在其中输入将写入DB的代码。DB操作结

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

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

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

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

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


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

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

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

当涉及到管理登录表单时,我会使用Main方法进行管理;显示登录表单,检查凭据,然后实例化要显示的UI并将其传递给Application.Run方法。

我刚刚做了类似的操作。我有一组表单要管理,就像规范所说的“页面”。我也有严格的页面流,比你的复杂一点。我会告诉你的

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

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

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


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

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

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

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


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

这确实有点棘手。:)一些我没想到的好建议,谢谢。第一点似乎是一个相当合理的解决方案,因为我希望能够尽可能完整地保留我已经拥有的表单,而不必在这些表单中重新编写太多代码。听起来是一个非常干净和好的解决方案。我会把它保存起来,看看我能想出什么。谢谢根据您对客户端的信任程度以及您的网络状况,您可能需要将数据库操作移动到应用程序服务器中,并让该服务器在运行它们之前仔细检查凭据。感谢您提供的提示。我会尽快检查驾驶室。:-)