2016-07-06 2 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()', как бы 'formPrev' знал, что делать, когда пользователь нажимает **« Далее »**? –

+0

Да. Если вы вернетесь, а затем нажмите ** Далее **, вы можете просто создать новый 'formCurrent', и ваши данные там могут быть недоступны. Ну, это явно означает, что вам придется сформировать двусвязный список форм. Одностороннее движение, как я сказал, легко можно сделать через конструкторов. Для другого, сделайте 'public static' метод для сбора' formCurrent' и удерживайте его в переменной 'Form' в вашей' formPrev' при возврате. Сохраните bool, который, когда true, создаст новую форму при нажатии ** Next ** в первый раз, но каждый раз после этого вызывается метод, который выполняет 'receiveFormNext.Show()'. –

2

Вместо отдельных форм вы можете поместить элементы управления из каждой формы на отдельные вкладки или в пользовательский элемент управления на каждой вкладке в tabcontrol, размещенном в одной форме. Затем вы можете управлять включенными/отключенными вкладками, как вы хотите, на основе прогресса через мастера. Например, возможно, вы хотите позволить им вернуться к любой предыдущей вкладке, но они могут идти только последовательно.

Два преимущества этой конструкции:

  • У вас есть общий контейнер для общих данных, но до сих пор скрыты эту информацию от остальной части кода.
  • Названия вкладок могут выступать в качестве формы хлебных крошек, чтобы показать прогресс через волшебника.
+0

Тогда вместо форм я бы использовал UserControls, и вместо конструкторов я использовал бы свойства.Да, это хорошо, но это немного сложнее. Я попытаюсь посмотреть, как это происходит. Благодаря! –

+0

Я должен был быть более ясным, вы правы, вы можете использовать элементы управления пользователя на вкладках или просто поместить элементы управления из форм на отдельные вкладки. Для потока будет немного больше накладных расходов, но будет проще управлять временем жизни формы, поскольку у вас есть только одна форма против многих форм, передаваемых туда и обратно. – cdkMoose