1

データをデータベースに保存する必要があるWindowsアプリケーションがあり、データロードクリスタルレポートを保存してレポートを表示すると、すべて保存ボタンをクリックすると発生します。

このデータをクリックすると名前が付けられたボタンbtn_Submitが保存され、レポートが表示されますが、保存には時間がかかるため、データが処理中であることをユーザーに知らせるために、その間にプログレスバーを表示したいと考えています.このWindowsアプリケーションでできること.

私はこのリンクhttp://www.codeproject.com/Tips/83317/BackgroundWorker-and-ProgressBar-demoを調べまし たが、私が望むものを正確に取得できません。

バックグラウンドワーカーは知っていますが、使用したことはありません。

上記のリンクに示されているように、バックグラウンドワーカーと進行状況バーを使用しましたが、進行状況バーは開始するとまったく停止しません。

誰でも私を助けることができますか?シナリオを示す例またはリンクを与えることができますか?.

このコードは Dowork(); に追加しました。

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
   PrintData arg = (PrintData)e.Argument;
   SalesMaster sm = arg.SalesData;
   BrokerMaster bm = arg.Broker;
   CustomerMaster ctm = arg.Customer;
   CompanyMaster cm = arg.Company;
   ArrayList hb = arg.Arrardata;
   int totunit = arg.totunit;
   decimal globalamt = arg.golbamt;
   SalesReport sreport = new SalesReport(sm, ctm, cm, bm, hb, totunit, glb_totalamt);


   sreport .MdiParent = arg.parentf;


   sreport .WindowState = FormWindowState.Maximized;
   sreport .Show();
}

この行でエラーが発生します sreport .MdiParent = arg.parentf;

このエラー:

Cross-thread operation not valid: Control 'frmParent' accessed from a thread other than the thread it was created on.

ここで何をすべきですか?

4

3 に答える 3

3

DoWorkRunWorkerCompletedイベントを購読し、

void btn_Submit_Click(object sender, EventArgs e)
{
    btn_Submit.Enabled = false; // disable button while saving report        
    lbl_Status.Text = "Please wait..";        
    backgroundWorker.RunWorkerAsync(); 
}

void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    // save report here
}

void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    btn_Submit.Enabled = true; // enable button
    lbl_Status.Text = "Report saved";
}

ラベルを使用する代わりに、PictureBoxスピナー待機イメージで表示できます。タスクのパーセンテージを示さないプログレス バーを表示するのは好きではありません。プログレス バーがいっぱいになると、タスクが完了することを期待しています。本当にプログレスバーを使用したい場合は、タイマーコンポーネントを使用します(タイマーの間隔を目的のリフレッシュレートに設定します):

void btn_Submit_Click(object sender, EventArgs e)
{
    btn_Submit.Enabled = false; // disable button while saving report       
    timer.Start();
    progressBar.Visible = true;
    //  backgroundWorker.RunWorkerAsync(new object[] { "Foo", 42 });  
    //  backgroundWorker.RunWorkerAsync(new CustomType("Foo", 42));   
    backgroundWorker.RunWorkerAsync(new { Foo = "Foo", Bar = 42 }););      
}

void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    // object[] args = (object[])e.Argument;
    // CustomType arg = (CustomType)e.Argument;
    dynamic arg = (dynamic)e.Argument;
    string foo = arg.Foo;
    int bar = arg.Bar;
    // save report here
}

void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    btn_Submit.Enabled = true; // enable button
    timer.Stop();
    progressBar.Visible = false;   
}

void timer_Tick(object sender, EventArgs e)
{
    if (progressBar.Value == progressBar.Maximum)
    {
        progressBar.Value = progressBar.Minimum;
        return;
    }

    progressBar.PerformStep();
}
于 2012-11-27T08:17:30.657 に答える
1

以下のコードのように、ProgressBar の Value プロパティを 0 にリセットしてみてください。

Worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);

実装されたイベント ハンドラー:

void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    progressBar1.Value = 0;
}
于 2012-11-27T08:14:05.063 に答える
0

プログレスバーを停止または非表示にするには、バックグラウンドワーカーの完了イベントを使用します。

于 2012-11-27T07:36:00.573 に答える