2017-03-04 9 views
0

実際に読み込み画面ではない読み込み画面を作成しました。その上に「読み込み中」のあるピクチャボックスを表示しているようです。VB.net mySQLを呼び出すたびに画面を読み込み

別の方法があるのだろうかと思っていました。私の仕事はちょっとうんざりしているから。

私は、クエリ、成功か

Loading.hide() 
Panel_Main.Enable = True 

ロードした後、この

Loading.show() 
Panel_Main.Enable = False 

を行うと、Panel_Mainが同じ親を持つクエリを得ました。

ユーザーが別のボタンをクリックして別のクエリを要求するのを防ぐために、読み込み画面を置く最善の方法は何ですか?

編集: また、モーダルフォームを開くためにshowdialog()を作成しました。今問題は、クエリが成功を返すかどうかの後にそのモーダルフォームを閉じる方法ですか?

クエリが

form2.close() 

このdidntの仕事を返した後、私は、クエリ

Dim form2 as New Form2 
form2.showdialog() 'this opens the new modal form 

そしてこれを得たとき、私はこれを使用していました。

私もForm2の

Public sub closeMe() 
    Me.close() 
End sub 

でパブリックサブを作った後のForm1

form2.closeMe() 
+0

当然の選択は、すなわちその 'ShowDialog'メソッドを呼び出すことにより、表示されたフォームモーダル対話、です。 'ShowDialog'はフォームが閉じられるまでブロックされ、呼び出し側はダイアログを閉じることができないので、フォームは閉じなければなりません。 – jmcilhinney

+0

私はすでにそれを作った。 showdialog()を呼び出して新しいモーダルフォームを開きますが、クエリが完了した後にそのダイアログを閉じるにはどうすればよいですか? – Maki

+1

なぜローディング画面が必要なのですか?どれくらい遅いですか?または、この時間を費やしてスピードを上げて、ユーザーの気分が悪いことから気をそらすのではなく、 – Plutonix

答えて

0

でこれを呼び出すことはここでは方法がで実行されているときにモーダルダイアログを表示する方法の例です呼び出しフォーム。トリックは、ダイアログを取得してメソッドを呼び出すことで、メソッドが完了して自身を閉じることができることも認識できるようにすることです。

ダイアログ:ダイアログが作成されると

'The method to execute while the dialogue is displayed. 
Private action As [Delegate] 

'The arguments to the method to be executed. 
Private args As Object() 

'The result of the executed method, if there is one, can be retrieved from here. 
Public Property Result As Object 

Public Sub New(action As [Delegate], ParamArray args As Object()) 
    ' This call is required by the designer. 
    InitializeComponent() 

    ' Add any initialization after the InitializeComponent() call. 
    Me.action = action 
    Me.args = args 
End Sub 

Private Sub Form2_Shown(sender As Object, e As EventArgs) Handles Me.Shown 
    'Make sure that the dialogue is displayed fully. 
    Refresh() 

    'Execute the method once the dialogue is displayed. 
    Result = action.DynamicInvoke(args) 

    'Close the dialogue when the method completes. 
    Close() 
End Sub 

、それはすなわち、メソッドへの参照、およびそのメソッドの引数のリスト、デリゲートを取ります。ダイアログが表示されると、その代理人が呼び出され、メソッドが実行されます。メソッドが完了すると、結果はパブリックプロパティで利用可能になり、その後閉じます。

発信者:例で

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Using dialogue As New Form2(New Func(Of Integer, String)(AddressOf GenerateRandomText), 10) 
     dialogue.ShowDialog() 

     Dim result = CStr(dialogue.Result) 

     MessageBox.Show(result) 
    End Using 
End Sub 

Private Function GenerateRandomText(length As Integer) As String 
    Const chars = "abcdefghijklmnopqrstuvwxyz" 

    Dim rng As New Random 
    Dim result = String.Empty 

    For i = 1 To length 
     result &= chars(rng.Next(chars.Length)) 

     'Simulate a long-running task. 
     Thread.Sleep(500) 
    Next 

    Return result 
End Function 

、発信者はランダム小文字のStringを生成する方法を含みます。ダイアログを表示し、そのメソッドを呼び出してダイアログボックスにString(10文字)を作成するように指示します。ダイアログが閉じられると、ダイアログボックスからStringが取得され、表示されます。

Thread.Sleepコールを追加すると、少し時間がかかり、ダイアログが現れるとすぐに消えることはありません。また、UIスレッドで長時間実行されるメソッドが実行されるため、対話ペイントが正しく行われないため、ダイアログにはRefreshコールが必要です。これをすべて適切に行うには、メソッドを実際にセカンダリスレッドで呼び出す必要がありますが、それはやや複雑です。

EDIT:

あなたが対話形式にBackgroundWorkerを追加する場合は、あなたがセカンダリスレッドでメソッドを実行することができます。実行しているメソッドがUIにアクセスしていないか、スレッド間の問題がある可能性があります。

対話:

'The method to execute while the dialogue is displayed. 
Private action As [Delegate] 

'The arguments to the method to be executed. 
Private args As Object() 

'The result of the executed method, if there is one, can be retrieved from here. 
Public Property Result As Object 

Public Sub New(action As [Delegate], ParamArray args As Object()) 
    ' This call is required by the designer. 
    InitializeComponent() 

    ' Add any initialization after the InitializeComponent() call. 
    Me.action = action 
    Me.args = args 
End Sub 

Private Sub Form2_Shown(sender As Object, e As EventArgs) Handles Me.Shown 
    BackgroundWorker1.RunWorkerAsync() 
End Sub 

Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork 
    'Execute the method on a background thread. 
    Result = action.DynamicInvoke(args) 
End Sub 

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted 
    'Close the dialogue when the method completes. 
    Close() 
End Sub 
+0

これはVB.netの権利ですか?これは私にとって初めてのことです。病気はこれを使用しようとします。ありがとう。私は後で進捗状況を掲載します。 – Maki

+0

それは確かにVB.NETです。そこにはいくつかの新しい概念があるかもしれません。 – jmcilhinney

+0

こんにちは、これは私のために難しいですLOL、多くのことを理解することはできませんが、私はしようとしています。とにかく、私はBackGroundWorkerについての検索をしています。私のプロジェクトにこれをどう使うべきか考えていますか? – Maki

関連する問題