在c#app中管理多个窗体窗体

有关管理具有多种表单的应用程序的好方法的任何想法,建议和模式。

第一页是登录,加载“主表单”,用户可以从那里启动许多其他“子表单”(可能会随着时间的推移而增长)。 用户应该能够在任何时候取消整个应用程序。

我知道我现在这样做的方式并不总是很优雅。

科迪

考虑使用DockPanel套件 。 它允许您创建多个表单,并为您的应用程序提供完整的对接面板解决方案。

我喜欢Explorer风格的界面:在主窗体中使用分割器。 使用左侧的列表控件或树控件,并将每个子表单的引用添加为项目上的标记。 当用户单击该项目时,将子表单从标记推送到拆分器的右侧。

您可以监视列表/树上的选择已更改事件以执行表单级validation。

您的设置方式没有任何根本性的错误,但我会更改您的登录表单与主表单之间的关系,以便您的主表单不会被您的登录表单加载。

在Program.cs文件的Main方法中,替换此(假定的)行:

Application.Run(new LoginForm()); 

用这样的东西:

 LoginForm login = new LoginForm(); DialogResult result = login.ShowDialog(); login.Dispose(); if (result != DialogResult.Cancel) { Application.Run(new MainForm()); } 

重写您的LoginForm,以便在登录成功时返回DialogResult.OKthis.DialogResult = DialogResult.OK ),而不是加载并显示MainForm的实例。

从那时起,加载和显示MainForm中的其他表单没有任何问题,前提是这样的用户界面对您的程序有意义(例如,根据需要包含各种其他浮动工具窗口的图形编辑程序)。

用户可以通过关闭主窗体来“取消”整个应用程序,这对于Windows程序来说是非常正常的行为。

“管理具有多种forms的应用程序。”

嗨科迪,

提示:请记住,您可以随时访问(在您使用System.Windows.Forms库的任何上下文中)通过以下方式获取应用程序中打开表单的数量的非常方便的方法:

 Application.OpenForms.Count 

我认为很大程度上取决于“管理”多种forms的含义,以及“子forms”这个术语的含义。 我假设您已经熟悉.NET中的内置MDI多窗口工具,并寻找替代方案,或者您不会问这个问题。 如果我的假设是错误的,请纠正我。

如果您的意思是“子表格”:在“主表格”范围内创建的表格,那么当主表格关闭时,它们将被处理。

我个人喜欢WinForms中的“多个独立窗口”模型,有时也称为SDI +(我认为这是创建这个缩写词的Chris Sells)。

我喜欢从“hi-jacking”开始标准的Program.cs文件,因此Main过程如下所示:

  static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Initializer.Initialize(); // it's now your responsibility to shut down the application ! Application.Run(); } 

其中’Intializer是一个带有一个公共静态方法的公共静态类’Intialize; 它可能看起来像这样:

  public static class Initializer { public static StartFormTemplate StartForm; public static MainFormTemplate MainForm; public static void Initialize() { MainForm = new MainFormTemplate(); MainForm.FormClosing += new FormClosingEventHandler(FormClosing); // StartForm will display MainForm in this case // MainForm.Show(); StartForm = new StartFormTemplate(); StartForm.FormClosing += new FormClosingEventHandler(FormClosing); StartForm.Show(); } } 

在Initializer类的范围内创建的每个表单都将是一个“独立窗口”(实际上有:Parent == null)。

此模型中有趣的“业务”是FormClosing事件中的逻辑(此处未显示),在此示例中,StartForm和MainForm共享。 您可以通过使用FormClosing调用的’sender参数并与MainForm进行比较来轻松测试Mainform结束:

 MainForm == sender 

并且您可以使用Application.OpenForms.Count来检测何时只有一个“独立”窗口可以关闭。 棘手的部分是确保您检测到要保持MainWindow打开并首先处理它们的情况,必要时取消FormClose事件。

我认为这对初学者来说已经足够了:这可能是一个“报春道”,你真的不想下去:)

比尔,最好的

我会推荐智能客户端UI应用程序块。

该块旨在帮助您构建复杂的基于WinForm的解决方案。 它提供了经过validation的架构和实现,可帮助您使用业务线前端应用程序中的常见模式构建应用程序。

  • 它允许您的应用程序基于模块或插件的概念。
  • 通过UI组合维护可重用的代码。
  • 它有助于使用模式进行开发,以便模块之间松散耦
  • 从Presentation中分离模型(业务逻辑和数据访问)。
  • 模型 – 视图 – 演示者模式。

您可以使用MDI 。 为此,请将父级的IsMdiContainer属性设置为true,并在显示子窗体之前将每个子级的MdiParent属性设置为父级。 然后,您可以使用MdiList菜单自动列出所有子窗体。

或者,您可以使用选项卡; 这对第三方框架来说最容易做到。

最后,您可以通过使用父窗体作为参数调用每个子窗体的Show方法来正常执行此操作。

有关更详细和具体的答案,请提供更多详细信息。

我使用导航式UI来做这种事情。 查看MSDN上的这篇文章,它描述了一个用于“归纳UI”应用程序的WinForms框架。