2016-07-06 68 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