none
有關progressBar問題 RRS feed

  • 問題

  • Dear all:
             我利用progressBar來做Check使用者的帳號能不能登入計算所花時間,那請問要怎麼讓ProgressBar開始計算後,當判斷該使用者後就把ProgressBar值加到100呢(比如目前才跑到60%當確認使用者正不正確後就自動加到100%)?


           

    Code Snippet

    private void btnLogin_Click(object sender, EventArgs e)
            {
                BackgroundWorker bk = new BackgroundWorker();
                bk.WorkerReportsProgress = true;
                bk.WorkerSupportsCancellation = true;
                bk.DoWork += new System.ComponentModel.DoWorkEventHandler(backgroundWorker1_DoWork);
                bk.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
                progressBar1.Maximum = 100;
                progressBar1.Minimum = 0;
                bk.RunWorkerAsync();

                Thread myThread = new Thread(new ThreadStart(CheckAccount));
                myThread.IsBackground = true;
                myThread.Start();
            }

            public void CheckAccount()
            {
                ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

                Authentication.Helper helper = new MyAddin.Authentication.Helper();
                bool CheckAccount = helper.CheckAccountCredential(txtAccount.Text, txtPassword.Text);
                if (CheckAccount)
                {
                    this.progressBar1.Value = 100;
                    CloseLoginForm();
                }
                else
                {
                    MessageBox.Show("Account or Password is Error!!");
                    EnabledAllControls();
                }
            }

            private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
                for (int i = 0; i < 50; i++)
                {
                    ((BackgroundWorker)sender).ReportProgress(2 * i);
                    Thread.Sleep(200);
                } 
            }

            private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                progressBar1.Value = e.ProgressPercentage;
            }

     

     

    2007年7月23日 上午 02:13

解答

  • 你的 CheckAccount 是另一個執行緒作業,本來就不能跨執行緒更新使用者介面。

     

    如果說你用了 BackgroundWorker 去做了原本在主執行緒就可以做的事

    (更新 Progress Bar),那何必要用?

     

    你可以試著把 CheckAccount 搬到 DoWork 中,這樣就可以用 ReportProgress() 和 ProgressChanged

    事件常式來做到你要的。

    2007年7月23日 上午 06:14
    版主

所有回覆

  • 你可以直接設定 ProgressBar.Value = 100 即可。

    或者,你可以在 DoWork 那裡做 ReportProgress() 時,設定值為 100。

     

    另外,如果 DoWork 中沒有處理工作的常式,那 BackgroundWorker 等於沒有任何作用 ...。

    2007年7月23日 上午 02:20
    版主
  • Dear 小朱:

                       1.請教你說直接設定Value = 100是只從哪邊直接給呢?因為要是我直接寫在CheckAccount裡面會有執行緒問題

                        if (CheckAccount)
                          {
                               this.progressBar1.Value = 100;
                          }
                          else
                          {
                               MessageBox.Show("Account or Password is Error!!");
                          }

                       2.如果 DoWork 中沒有處理工作的常式,那 BackgroundWorker 等於沒有任何作用 ...。這邊有點...不太懂你的意思

                       不知道能不能在解說詳細給小的更了解.

    2007年7月23日 上午 05:52
  • 你的 CheckAccount 是另一個執行緒作業,本來就不能跨執行緒更新使用者介面。

     

    如果說你用了 BackgroundWorker 去做了原本在主執行緒就可以做的事

    (更新 Progress Bar),那何必要用?

     

    你可以試著把 CheckAccount 搬到 DoWork 中,這樣就可以用 ReportProgress() 和 ProgressChanged

    事件常式來做到你要的。

    2007年7月23日 上午 06:14
    版主