2014-01-22 70 views
1

當我點擊我的命令按鈕時,需要幾秒鐘才能完成可能會使最終用戶認爲程序滯後的進程,然後我想到進度條。所以如何讓進度條在進程運行的同時工作,以便用戶不會覺得該程序是滯後的,我是vb.net的新手,我現在研究安靜一段時間,仍然無法得到它的工作方式也不會如何開始。進度條與進程

感謝您的幫助提前

這是我的命令按鈕的過程。

 Private Sub LoginBTN_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LoginBTN.Click 
    Using ClientDashboardx As New ClientDashboard 
     Try 

      cn = New ADODB.Connection 
      conDB() 
      cn.Open() 

      rs = New ADODB.Recordset 
      rs.Open("SELECT * FROM tb_registration", cn, 0, 3) 

      If txtuserid.Text = "" Or txtuserpass.Text = "" Then 
       MsgBox("Value Null") 
       Exit Sub 
      Else 
       Do While Not rs.EOF 
        Dim strLogin = txtin.Text 
        Dim strLogout = txtout.Text 
        If rs("st_acc_number").Value = txtuserid.Text And rs("st_password").Value = txtuserpass.Text And rs("st_log").Value = strLogin Then 
         MsgBox("Account in use") 
         Exit Sub 
        ElseIf rs("st_acc_number").Value = txtuserid.Text And rs("st_password").Value = txtuserpass.Text And rs("st_log").Value = strLogout Then 
         Dim strID = rs("st_acc_number").Value 
         Dim strUserName = rs("st_fname").Value & " " & rs("st_lname").Value 
         Dim strTotalTime = rs("st_totaltimeleft").Value 
         rs.Close() 
         SaveAccNumber.Text = strID 
         SaveUserName.Text = strUserName 
         SaveTotalTime.Text = strTotalTime 

         cn.BeginTrans() 
         cn.Execute("UPDATE tb_registration SET st_log='in' where st_acc_number='" & SaveAccNumber.Text & "'") 
         cn.CommitTrans() 
         cn.Close() 

         ClientDashboardx.id_lbl.Text = SaveAccNumber.Text 
         ClientDashboardx.iduser_lbl.Text = SaveUserName.Text 
         ClientDashboardx.UserTotalTime.Text = SaveTotalTime.Text 
         ClientDashboardx.AutoUpdate_Button.Enabled = True 
         Me.Hide() 
         ClientDashboardx.ShowDialog() 
         Me.Show() 
         Exit Sub 
        Else 
         rs.MoveNext() 
        End If 
       Loop 
       MsgBox("User/Pass Mismatch") 
       Exit Sub 
      End If 
     Catch ex As Exception 
      MsgBox("Server Offline", MsgBoxStyle.Critical, "") 
     End Try 
    End Using 
End Sub 

回答

3

您應該在單獨的線程或background worker中執行您的長時間運行過程。

下面是如何使用背景工人:

添加一個BackgroundWorker和進度到窗體

添加一個私有變量來保存你的結果

Private _success As Boolean 

添加代碼來顯示ProgressBar並在Form_Load中啓動工作人員

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    _success = False 
    ProgressBar1.Style = ProgressBarStyle.Marquee 
    ProgressBar1.Visible = True 
    BackgroundWorker1.RunWorkerAsync() 
End Sub 

執行你的長期運行的操作這裏

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork 
    'perform your db access here and set the result in _success 
End Sub 

當工人完成隱藏進度條,並根據結果執行某些動作

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted 
    ProgressBar1.Visible = False 
    If _success Then 
     Me.Hide() 
     ClientDashboardx.ShowDialog() 
     Me.Show() 
    Else 
     MsgBox("User/Pass Mismatch") 
    End If 
End Sub 
+0

謝謝你這麼多,一個直接的指導。這會爲我節省很多時間。歡呼聲 –

+0

我遇到了一個錯誤,在這裏 SaveAccNumber.Text = strID SaveUserName.Text = strUserName中 SaveTotalTime.Text = strTotalTime 這是錯誤的「跨線程操作無效:從一個線程訪問控制‘客戶端’而不是它創建的線程。「我該怎麼辦?這是我第一次看到這樣的錯誤。 –

+0

您不能在不使用委託的情況下在後臺工作者內設置TextBox的Text值,因爲它在不同的線程上運行(因此出現錯誤)。在變量中設置值,然後使用這些變量填充RunWorkerCompleted事件中的文本框。 –