【问题标题】:.NET WinForms - "Back" button.NET WinForms - “返回”按钮
【发布时间】:2023-04-04 08:30:01
【问题描述】:

我正在编写一些有点像向导的代码,但我不知道该怎么做。

我有多种形式。每个人都会做一些不同的事情,这取决于前一个表单中的数据。有一个“主表单”可以从每个人那里获取输入并将其传递给另一个人。通常我只会使用 form.ShowDialog(),等待输入,实例化下一个表单并重复。但是,这一次用户需要每隔一段时间返回到之前的表单。

我用“GoTo”语句编写了一些非常简单的代码,以便您理解问题所在。是的,它有效,但我想知道是否有更好的方法来做到这一点。我已经被这个问题困扰了一段时间,所以非常感谢任何帮助!

测试表格:

Public Class TestForm
    Public Property Result As Object

    Public Sub New(data As Object)
        InitializeComponent()
        DoSomethingWithData(data)
    End Sub

    Private Sub DoSomethingWithData(data As Object)
        Result = "something"
    End Sub
End Class

Public Class MasterForm
    Inherits Form

    Public Sub New()
        Dim button As New Button()
        AddHandler button.Click, AddressOf Start

        Controls.Add(button)
    End Sub

    Private Sub Start(sender As Object, e As EventArgs)
        Step1:
        Dim testForm1 = New TestForm("rainbows")
        If testForm1.ShowDialog() = DialogResult.Cancel Then
            Return
        End If

        Step2:
        Dim testForm2 = New TestForm(testForm1.Result)
        If testForm2.ShowDialog() = DialogResult.Cancel Then
            GoTo Step1
        End If

        Step3:
        Dim testForm3 = new TestForm(testForm2.Result)
        If testForm3.ShowDialog() = DialogResult.Cancel Then
            Goto Step2
        End If
    End Sub
End Class

【问题讨论】:

  • 表单可以嵌入到另一个表单的容器中。我解决这个问题的方法是在页面登陆时依次实例化所有每个表单,然后将它们留在内存中,直到用户完成向导。 Back 可以是一个简单的例子,即在面板上隐藏当前表单并显示前一个表单。这里的问题是您的逻辑是顺序的,而不是更像是向导当前正在执行的操作的状态机,由用户选择执行的操作进行更改。

标签: .net vb.net forms winforms


【解决方案1】:

您可以将每个表单中的控件放置到单个选项卡上,或者放置在单个表单中托管的选项卡控件中每个选项卡上的用户控件中,而不是单个表单。然后,您可以根据向导的进度根据需要控制启用/禁用选项卡。例如,也许您想让它们返回到任何上一个选项卡,但它们只能按顺序前进。

这种设计的两个优点:

  • 您有一个共享数据的通用容器,但仍然在其余代码中隐藏了该信息。
  • 标签标题可以作为面包屑的形式来显示向导的进度。

【讨论】:

  • 然后我会使用 UserControls 而不是表单,我会使用属性而不是构造函数。是的,这个不错,但维护起来似乎有点困难。我会试试看情况如何。谢谢!
  • 我应该更清楚,你是对的,你可以在选项卡上使用用户控件,或者只是将表单中的控件放在各个选项卡页面上。流程会产生更多开销,但管理表单生命周期会更容易,因为您只有一个表单,而许多表单来回传递。
【解决方案2】:

随着您打开每个后续表单,将当前表单对象作为参数传递给新表单构造函数,然后调用新表单的ShowDialog()Hide() 仅表单。完成此操作后,您始终可以使用 "Go Back" 按钮返回上一个表单的对象,该按钮仅使用 formPrev.Show() 显示上一个表单。所以首先,请记住Hide() 表单而不是Close()-ing 它。

希望这会有所帮助!

【讨论】:

  • 这其实是个好主意,但是回去之后我就无法前进了。假设我使用 formPrev.Show() 然后 formCurrent.Hide()formPrev 怎么知道当用户按下 "Next" 时该做什么?
  • 是的。如果您返回然后按下一步,您可能会生成一个新的formCurrent,而您的数据可能不存在。好吧,这显然意味着您必须形成一个双向链接的表单列表。正如我所说,一种方式的移动可以通过构造函数轻松完成。对于另一个,创建一个public static 方法来收集formCurrent 并在返回时将其保存在formPrev 中的Form 变量中。保留一个布尔值,当它为 true 时会在第一次按下 Next 时创建一个新表单,但之后每次都会调用一个执行 recievedFormNext.Show() 的方法。
猜你喜欢
  • 2010-12-08
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-18
  • 2020-02-29
相关资源
最近更新 更多