【问题标题】:Making multiple forms appear as one in VB.NET使多个表单在 VB.NET 中显示为一个
【发布时间】:2013-08-12 15:56:21
【问题描述】:

我正在用 VB.NET 编写一个 Windows 窗体应用程序。我有三个表单:主表单,显示帐户列表,帐户表单允许用户查看/编辑特定帐户的信息,策略表单允许用户查看/编辑信息该帐户的具体政策。我希望表单看起来好像它们都是同一个窗口。示例:当应用程序启动时,用户在主窗体的列表框中单击一个帐户名称,然后单击“编辑”。我想要发生的是窗口保持在完全相同的位置并保持相同的确切大小,只有主表单的内容似乎被帐户表单的内容替换。如果用户随后选择从帐户表单中编辑策略,则同样如此。当用户完成并单击“保存”时,主窗体会恢复。在整个用例中,用户会觉得好像他们一直在查看同一个窗口,而该窗口的内容会发生变化。

我该怎么做?我尝试过类似的方法:

Dim newForm as New AcctForm
newForm.Location = Me.Location
newForm.Show()
Me.Close()

问题在于,如果用户移动原始窗口,新窗口会出现在父窗体最初出现的位置,而不是最终出现的位置。

【问题讨论】:

  • 使用用户控件而不是表单。
  • 没有办法使用面板来完成这个?还是如 HighCore 所说,用户控件?
  • +1 到用户控制。创建三个用户控件(每个表单一个)然后相应地放置它们(或显示/隐藏它们)
  • 您可以完全撕毁您的程序并丢掉数周的工作,这是用户的常见建议,他们对 Winforms 一无所知,但不会让他们在发布 cmets 时减慢他们的速度。或者您可以将表单的 StartupPosition 属性设置为 Manual。
  • 如何实现某种 MDI 父/子概念。

标签: vb.net winforms


【解决方案1】:

我看到这已经在 cmets 中了,但我过去在这种情况下所做的是将应用程序中的每个“表单”构建为自定义控件。然后我有一个实际的表单,并且导航通过更改当前加载到父表单上的自定义控件来工作。要从一个屏幕/视图移动到另一个屏幕/视图,请从表单的控件集合中删除当前自定义控件并添加新的自定义控件。

我相信这优于手动设置启动位置和大小,因为您可以使用表单的 .SuspendLayout()/.ResumeLayout() 方法向用户隐藏没有加载控件的中间状态。当您希望一种形式被另一种形式完全取代时,这更难做到。

这也使得在一个地方设置某些表单属性并让它们在应用程序中保持一致变得很容易。您甚至可以在表单上设置一个区域,其中包含现在将显示在每个视图中的控件。

在使用这种模式时,我通常让我的每个自定义控件都继承自一个公共基础。一开始你可能不会对这个基础做任何具体的事情,但它几乎总能在以后派上用场。

最后,改用此方案比您想象的要容易。只需转到每个当前表单的代码,您就会发现每个类当前都继承自 System.Windows.Forms.Form。大多数情况下,您真正​​需要做的就是将它们更改为从 System.Windows.Forms.Panel 继承,这样您就完成了大部分工作。

【讨论】:

  • 感谢您的信息,我决定重新设计并使用控件。
【解决方案2】:

正如其他人所说,使用自定义控件或面板等重新设计您的应用程序可能会更好。

但是,要回答您关于表单位置看似随机的问题,首先要检查的是每个表单的 StartPosition 属性设置为 Manual。

如果您的主窗体可调整大小,那么我还将添加代码以将 newForm 也调整为相同大小。

我希望这有助于您解决眼前的问题;以便您可以继续重新设计应用程序!

【讨论】:

  • 感谢您的回答,请参阅我对关于为什么手动起始位置仍然不适合我尝试做的事情的问题的评论。
【解决方案3】:

早上好,还有另一种方法。将第二种形式的属性设置为(最顶部)并使用

from2.show();

让您在表单之间切换并让表单2居于其他位置

谢谢

【讨论】:

    【解决方案4】:

    尝试使用 ShowDialog()

    Dim newForm as New AcctForm
    newForm.Location = Me.Location
    newForm.ShowDialog()
    Me.Close() <-- removed this
    

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多