0

プログレスバーを挿入した C# Windows アプリケーションを作成しました。

ボタンをクリックするとプログレス バーが表示され、2 ~ 3 秒間プロセスが開始され、プロセス バーが完了すると非表示になります。

このコードを使用してこれを解決しましたが、機能しません。

プログレスバーの実行中、ラベルボックスは「生成中... 45%」のようになり、ラベルボックスの完了後は「生成100%..」になるはずですが、ラベルを挿入するとエラーが表示されます。

生成ボタンをクリックする前の画像です。

ここに画像の説明を入力
処理中、私はこのように
ここに画像の説明を入力
なるはずです..最終プロセスでは、IDはこのようになり、進行状況バーは非表示になるはずです..
ここに画像の説明を入力

        ProgressBar1.Visible = true;

        if (isProcessRunning)
        {
            MessageBox.Show("A process is already running.");
            return;
        }

        Thread backgroundThread = new Thread(
            new ThreadStart(() =>
            {
                isProcessRunning = true;
                for (int n = 0; n < 100; n++)
                {
                    Thread.Sleep(1);
                    progressBar1.BeginInvoke(new Action(() => progressBar1.Value = n));
                }
                MessageBox.Show("Generated!!!");


                if (progressBar1.InvokeRequired)
                    progressBar1.BeginInvoke(new Action(() => progressBar1.Value = 0));
                isProcessRunning = false;
            }

        ));

        // Start the background process thread
        backgroundThread.Start();
4

3 に答える 3

11

BackgroundWorkerC# winform で進行状況バーを表示するために使用することをお勧めします。
ここに例があります、

    public partial class Form1 : Form
{
    BackgroundWorker bgw = new BackgroundWorker();       
    public Form1()
    {
        InitializeComponent();
        label1.Text = "";
        label2.Text = "";
    }

    private void button1_Click_1(object sender, EventArgs e)
    {
        bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
        bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
        bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
        bgw.WorkerReportsProgress = true;
        bgw.RunWorkerAsync();
    }

    void bgw_DoWork(object sender, DoWorkEventArgs e)
    {
        int total = 57; //some number (this is your variable to change)!!

        for (int i = 0; i <= total; i++) //some number (total)
        {
            System.Threading.Thread.Sleep(100);
            int percents = (i * 100) / total;
            bgw.ReportProgress(percents, i);
            //2 arguments:
            //1. procenteges (from 0 t0 100) - i do a calcumation 
            //2. some current value!
        }
    }

    void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
        label1.Text = String.Format("Progress: {0} %", e.ProgressPercentage);
        label2.Text = String.Format("Total items transfered: {0}", e.UserState);
    }

    void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
         //do the code when bgv completes its work
    }
}

でプログレス バーの表示を false に設定できますbgw_RunWorkerCompleted
次のリンクは、backgroundworker
DotNetPerls
MSDN リファレンス
CodeProject
Good Luck の使用方法を示しています:)

于 2013-08-03T06:07:15.490 に答える
0

これは、backgroundWorker を使用しているコードです。

    public partial class Form1 : Form
{

    BackgroundWorker bgw = new BackgroundWorker();      
    public Form1()
    {
        InitializeComponent();
        label3.Text = "";


        this.StartPosition = FormStartPosition.CenterScreen;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Application.Exit();
    }


    private void btn_generate_Click(object sender, EventArgs e)
    {
        progressBar1.Visible = true;
        bgw.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        bgw.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
        bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
        bgw.WorkerReportsProgress = true;
        bgw.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
       int total = 100; //some number (this is your variable to change)!!

        for (int i = 0; i <= total; i++) //some number (total)
        {
            System.Threading.Thread.Sleep(10);
            int percents = (i * 100) / 100;
            bgw.ReportProgress(percents, i);

        }
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
        label3.Text = String.Format("Progress: {0} %", e.ProgressPercentage);
        if (e.ProgressPercentage == 100)
        {
            label3.Text = String.Format("Generated.. {0} %", e.ProgressPercentage);

        }
       // label2.Text = String.Format("Total items transfered: {0}", e.UserState);
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        progressBar1.Visible = false;
    }



}`

これで、下のコードに問題があります。最初にボタンをクリックするとプログレスバーが1回実行され、2回目にクリックすると2回実行されます..そうでなければ、コードは完全に機能しています..

于 2013-08-03T06:46:47.397 に答える