2011-08-15 6 views
0

フォームにプログレスバーが表示されていません。Backgroundworker ReportProgress発生していますが、ProgressBarが変更されていません

私は電子メールの送信ボタンをクリックすると、この:

Public Sub SendMail() 
    If CheckSettings() = False Then Exit Sub 
    BackUpEbillFile() 
    LockForm(True) 
    StatusBars(1, "Sending emails...") 
    ProgressBar1.Maximum = intInvoicesToSend 
    BackgroundWorker1.RunWorkerAsync() 
End Sub 

私は、次のイベントがありますSendBillsで

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork 
    e.Result = SendBills() 
End Sub 

Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged 
    Console.WriteLine("I DID IT MA!!!!1 status: " & ProgressBar1.Value) 
    ProgressBar1.PerformStep() 
    Console.WriteLine("I DID IT MA!!!!2 status: " & ProgressBar1.Value) 
End Sub 

、メールクラスであり、私は次の操作を行います。

smtp.Send(msg) 
Console.WriteLine("I DID IT PA!!!! count: " & iCount) 
frmBilling.BackgroundWorker1.ReportProgress(iCount) 

私の問題は、ProgressChangedのProgressBar1.PerformStep()にあります。進捗状況は変わりましたが、Progressbar1は変化していません。それはゼロのままです。

  • intInvoicesToSendが(16歳)16
  • ProgressBar1.Minimum = 0
  • ProgressBar1.Maximum = intInvoicesToSend
  • あるProgressBar1.Step = 1

ここから私のコンソールでありますconsole.writelines:

I DID IT PA !!!!カウント:0

を私はそれが1つの状態を!!!! MA DID:0

私はそれが2つの状態!!!! MA DID:1

を私はPAそれをやった!!!!カウント:私はDID 1

をITが1つの状態!!!! MA:私はDID 1

をITが2つの状態を!!!! MA:2

を私はPAそれをやった!!!!カウント:私はDID 2

をITが1つの状態!!!! MA:私はDID 2

をITが2つの状態を!!!! MA:3

を私はPAそれをやった!!!!カウント:私はそれが1つの状態を!!!! MA DID 3

:3

を私はそれが2つの状態!!!! MA DID:4

は、誰もが私が間違ってやっている何を教えてもらえますか? ありがとう!

+0

なぜリターンはここでは機能しませんか? ProgressBar1.Maximum = intInvoicesToSend(16でした)ProgressBar1.Step = 1はすべて異なる行にあります... – ErocM

+0

2つのリターン(空白行を挟んで)または異なるフォーマット(私は自分の編集で行って、それを読むのが簡単だと思っているので、リストに入れてください...) –

+0

LockFormは何があってもうまくいくようです。 –

答えて

1

私はあなたが間違ったインスタンスでReportProgressメソッドを呼び出すと思われます。

この行を参照してください。

frmBilling.BackgroundWorker1.ReportProgress(iCount) 

BackgroundWorkerのは、フォーム内で直接定義されている場合、あなたはfrmBilling部分をオフに残し、そして同じように、これを指定することができます。

BackgroundWorker1.ReportProgress(iCount) 

あなたが持っている道を間違ったインスタンスでReportProgressが呼び出される可能性があります。

+0

ありがとうございます。 reportprogressは別のクラスからの呼び出しです。おそらくそれを行う正しい方法ではないが、プログラムはうまく書かれていない、私はそれを触れている。 frmBillingを削除した場合、BackGroundWorkerは表示されません。さらに、偶数は正確にプログレバーを視覚的に更新しないで正しく発射しています。 – ErocM

+0

@ErocM: 'frmBilling'が間違ったインスタンスを指していると思われます。それが別のクラスにある場合は、発信者が事前に正しく設定していることを確認してください。 –

+0

あなたは正しいです。クラスのメソッドを自分のフォームに移動し、frmBillingへの参照を移動し、いくつかのクロススレッド例外を取得し始めました。私はそれらを修正し、すべてが正しく機能するようになった。助けてくれてありがとう! – ErocM

0

試してみてください...

Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged 
    Console.WriteLine("I DID IT MA!!!!1 status: " & ProgressBar1.Value) 
    ProgressBar1.PerformStep() 
    Application.DoEvents() 
    Console.WriteLine("I DID IT MA!!!!2 status: " & ProgressBar1.Value) 
End Sub 
関連する問題