2017-09-26 7 views
-1

フォームの挿入されたデータの有効性をチェックする関数があります。この関数では、ユーザーから何らかの確認を求めなければなりません。この確認には関数の外部で尋ねる必要があります私はこの確認の一つを打ち、私はメッセージを作成し、検証関数を送信する、ユーザーの確認かどうか、関数は再び呼び出されるだろう関数のチェックポイントVB.NET

私は関数にいくつかのチェックポイントを入れる必要があるので、検証関数を呼び出す私はユーザーからの選択された確認でそのチェックポイントにジャンプし、そのチェックポイントから検証関数を実行する

1:これはまったく可能ですか?

2:これを行う方法はありますか?

編集1:私はビジネスレイヤーでこの検証を行っていますが、そこからメッセージボックスを表示することはできません。メッセージを作成してUIレイヤーに返すだけです。私は

Public Class BL 
    Private Queue As Queue(Of String) 
    Public Sub New() 
     Dim checkpoints = New String(){"CheckPoint1","CheckPoint2","CheckPoint3"} 
     checkpoints.ToList.ForEach(Function(item) <b>Queue.Enqueue(item)</b>) 
    End Sub 

    Public Function Func(ByVal res As Response,ParamArray ByVal params As String()) As Response 
     Dim response As Response 
     Dim chk = Queue.Dequeue() 
     GoTo chk 
     CheckPoint1: 
     'Do some stuff 
     response = New Response(Response.ResponseType.Message,"Are you sure you wanna do this?") 
     Return response 
     CheckPoint2: 
     If(res.Type = Response.ResponseType.ResponseBack) 
      Dim r As DialogResult = Convert.ChangeType([Enum].Parse(GetType(DialogResult),res.Message),GetType(DialogResult)) 
      If (r= DialogResult.OK) 
      'Do stuffs on DialogResult.Yes 
       Else 
      'Do stuffs on DialogResult.No 
      End If 
      'Do other stuffs with database 
     End If 
     ' Do other stuff 
     response = New Response(Response.ResponseType.Message,"You should do this!!OK?") 
     Return response 
     CheckPoint3: 
     'Do stuff like CheckPoint1 

    End Function 
End Class 
Public Class Response 
    Friend Enum ResponseType 
     Message 
     Result 
     ResponseBack 
     None 
    End Enum 
    Friend Message As String 
    Friend Type As ResponseType 
    Friend Sub New(ByVal type As ResponseType,msg As String) 
     Message=msg 
     Type= type 
    End Sub 
    End Class 

Public Class Form1 
    Public Sub New() 
     ' This call is required by the designer. 
     InitializeComponent() 
     Dim BL As New BL() 
     ' Add any initialization after the InitializeComponent() call. 
     Dim rese As Response 
     Do 
      rese =BL.Func(Nothing) 
      BL.Func(new Response(Response.ResponseType.ResponseBack,if(MessageBox.Show(rese.Message).ToString()))) 
     Loop Until rese.Type <> Response.ResponseType.Result 
     MessageBox.Show(if(rese.Message="True","OK","ERROR")) 
    End Sub 
End Class 
+0

@ParrishHusband関数から戻り、いくつかのものを行い、もう一度呼び出す必要がありますが、whileループでこれをどうやって行うことができますか? – AliTheOne

+0

質問を少し違って読んで、最初のWhileループのコメントを無視します。あなたは、あなたが検証しているもの、そして機能が何をしているのか、より具体的になることができますか? –

+0

@ParrishHusband私はちょうど私の質問を編集しました! – AliTheOne

答えて

0

これはあなたのために働く必要があります。

Public Class BL 

    Private Queue As Queue(Of String) 

    Private _checkpoints As Dictionary(Of String, Func(Of Response, Response)) = New Dictionary(Of String, Func(Of Response, Response)) From 
    { 
     { "CheckPoint1", Function (res) New Response(Response.ResponseType.Message, "Are you sure you wanna do this?") }, 
     { "CheckPoint2", Function (res) 
       If (res.Type = Response.ResponseType.ResponseBack) 
        Dim r As DialogResult = CType(Convert.ChangeType([Enum].Parse(GetType(DialogResult), res.Message), GetType(DialogResult)), DialogResult) 
        If (r = DialogResult.OK) 
         'Do stuffs on DialogResult.Yes 
        Else 
         'Do stuffs on DialogResult.No 
        End If 
        'Do other stuffs with database 
       End If 
       ' Do other stuff 
       Return New Response(Response.ResponseType.Message, "You should do this!!OK?") 
      End Function 
     }, 
     { "CheckPoint3", Function (r) New Response(Response.ResponseType.Message, "Are you sure you wanna do this?") } 
    } 

    Public Sub New() 
     _checkpoints.ToList().ForEach(Sub(item) Queue.Enqueue(item.Key)) 
    End Sub 

    Public Function Func(ByVal res As Response, ParamArray ByVal params As String()) As Response 
     Dim chk = Queue.Dequeue() 
     Return _checkpoints(chk).Invoke(res) 
    End Function 
End Class 

は、基本的にこれは、あなたがしたい Responseを返し Func(Of Response, Response)から Stringをマップ Dictionary(Of String, Func(Of Response, Response))を作成します。

これにはいくつかのバリエーションがありますが、これはあなたにはうってつけかもしれませんが、もしあなたが仕事をしているかどうかを私に知らせることができます。

+0

ありがとうございます。動作しているかどうかお知らせします。 – AliTheOne

+0

@AliTheOne - 正常に動作するはずです。正確にあなたのコードに正確にマッチします。 – Enigmativity

+0

_checkpointsでparamsを使用するにはどうすればよいですか? – AliTheOne

1

をしたところ、この答えを私は最初から機能を実行したいから、それを実行する必要はありませんこれは客観的な答えはありませんが、助けることができます。あなたは質問と回答を含む何らかの種類のクラスが必要です。あなたの検証クラスは質問のリストを返します(本当ですか?)。

Class ValidationOutput 
    ValidationId 
    Message 
    Result 
End Class 

検証関数を呼び出した後、ユーザーから追加情報が必要な検証リストが表示されます。これは、検証関数の外部で処理することができます。余分な情報が得られたら、もう一度検証を呼び出し、同じリストをパラメーターとして渡します。検証するときは、必要なすべての追加情報があるかどうかを調べてください。

1

私は、ビジネスロジックがユーザーのやりとりを処理して2つの部分に分割してはならないと考えています。

ただし、この方法が望ましい場合は、コールバックを使用できます。検証/ビジネスメソッドのデリゲートパラメータを定義し、確認が必要なときにそのデリゲートを呼び出します。戻り値に応じて、操作を保存するかどうかを続けます。

デリゲートをメソッドに渡す場合は、以下のリンクを確認してください。

https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/delegates/how-to-pass-procedures-to-another-procedure

+0

OKあなたのお時間をありがとうございます。 – AliTheOne

関連する問題