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

フォームは別のフォームのコンテナに埋め込むことができます。私がこれに取り組む方法は、ページが着陸したときに順番に各フォームをインスタンス化することですが、ユーザーがウィザードを終了するまでメモリに残しておきます。 Backは、現在のフォームをパネル上に隠し、前のフォームを表示する単純なケースになります。ここでの問題は、あなたのロジックが、ウィザードが現在やっていることの状態マシンに似ているのではなく、ユーザーが選択したものによって変更されていることです。 –

答えて

0

は、新しいフォームのコンストラクタにパラメータとして現在のフォームオブジェクトを渡し、その後、新しいフォームのShowDialog()Hide()フォームだけを呼び出します。これは、"戻る"ボタンを使用して戻るに戻ることができる以前のフォームのオブジェクトを常に持っています。これは、前のフォームをformPrev.Show()で示しています。だから最初は、Close()の代わりにHide()のフォームを覚えておいてください。

希望すると便利です。

+0

それは実際には良いアイデアですが、その後に戻ってから前に進むことはできません。 'formPrev.Show()'と 'formCurrent.Hide()'を使うと、 'formPrev'はユーザーが**" Next "**を押したときにどうしたらいいのでしょうか? –

+0

はい。 ** Next **を押すと、新しい 'formCurrent'が生成され、データがまだ存在しない可能性があります。これは明らかに、フォームの二重リンクリストを作成する必要があることを意味します。私が言ったように、片方向の動きはコンストラクターを使って簡単に行うことができます。もう1つは 'formCurrent'を収集し、' formPrev'の 'Form'変数に保持する' public static'メソッドを作ります。 trueを返すと、** Next **を押すと新しいフォームが作成されますが、そのたびに 'recievedFormNext.Show()'を呼び出すメソッドが呼び出されます。 –

2

個々のフォームの代わりに、各フォームのコントロールを個々のタブまたは単一のフォームでホストされているタブコントロール内の各タブのユーザーコントロールに配置できます。ウィザードの進行状況に応じて、タブの有効/無効を制御できます。たとえば、前のタブに戻ることができますが、順番に進むことしかできません。この設計の

二つの利点:

  • あなたが共有データのための共通の容器を持っているが、それでも、コードの残りの部分から、その情報を隠しています。
  • タブのタイトルは、パンクラムの一種として機能し、ウィザードの進行状況を表示できます。
+0

フォームの代わりにUserControlsを使用し、コンストラクタの代わりにプロパティを使用します。うん、これは良いですが、維持するのが少し難しいようです。私はそれがどうなるか試してみるよ。ありがとう! –

+0

私はもっとはっきりしているはずです。あなたはタブ上でユーザーコントロールを使うことができますし、個々のタブページのフォームからコントロールを入れることもできます。フローにはもう少しオーバーヘッドがありますが、1つのフォームと複数のフォームが前後に渡されるだけなので、フォームのライフタイムを管理する方が簡単です。 – cdkMoose

関連する問題