2016-07-06 66 views
1

我正在编写一些工作有点像向导一样,但我不知道如何去做。.NET的WinForms - “返回”按钮

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

我用“GoTo”语句编写了一些非常简单的东西,所以你可以理解这个问题。是的,它可行,但我想知道是否有更好的方法来做到这一点。我一直困在这个问题一段时间,所以任何帮助将非常感谢!

TESTFORM:

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 
+1

表单可以嵌入到另一个表单的容器中。我将解决这个问题的方法是在页面登陆时依次实例化所有的表单,但是直到用户完成向导后才将它们留在内存中。返回可以是隐藏当前表单并显示前一个表单的简单情况。这里的问题是你的逻辑是顺序的,而不是更像是一个向导正在做什么的状态机,而是由用户选择做什么来改变。 –

回答

0

随着你打开每个连续的形式,传递当前表单对象作为参数,以新的形式的构造函数,然后调用只是形式新形式的ShowDialog()Hide()。完成此操作后,您始终拥有以前表单的对象,您可以通过使用“返回”按钮返回到该对话框,该按钮仅使用formPrev.Show()显示以前的表单。所以首先,请记住Hide()的形式,而不是Close()-它。

希望这会有所帮助!

+0

这实际上是一个好主意,但是在返回后我将无法前进。假设我使用'formPrev.Show()'和'formCurrent.Hide()',当用户按下**“Next”**时,formPrev怎么会知道该怎么做? –

+0

是的。如果你回去然后按** Next **,你可能会产生一个新的'formCurrent',你的数据可能不会存在。这显然意味着你必须形成一个双向链表。正如我所说,单向运动可以通过构造函数轻松完成。对于另一个,使用'public static'方法来收集'formCurrent',并在返回时将其保存在'formPrev'的'Form'变量中。保持一个布尔值,当true时会在第一次按下** Next **时创建一个新表单,但每次之后都会调用一个'recievedFormNext.Show()'方法。 –

2

而不是单独的窗体,您可以将每个窗体的控件放到单个窗体中的控件或用户控件中的每个选项卡上。然后,您可以根据通过向导的进度控制启用/禁用选项卡。例如,也许你想让他们回到任何以前的选项卡,但他们只能按顺序前进。这种设计的

两个优点:

  • 您有共享数据的通用集装箱,但仍隐藏在代码的其余部分的信息。
  • 标签标题可以充当面包屑的一种形式,以显示通过向导的进度。
+0

然后而不是形式我会使用UserControls而不是构造函数我会使用属性。是的,这个很好,但是它似乎有点难以维护。我会试着看看它是如何发展的。谢谢! –

+0

我应该更清楚了,你是对的,你可以在选项卡上使用用户控件,或者将表单中的控件放在单独的标签页上。流程会有一些额外的开销,但是由于您只有一种形式与许多形式来回传递,所以它将更易于管理形式生命周期。 – cdkMoose