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

我建议您使用BackgroundWorker在 C# 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 Reference
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;
    }



}`

在下面的代码中有一个问题,当我第一次单击按钮时,进度条运行一次,如果我第二次单击它会运行 2 次,依此类推.. 否则代码完美运行..

于 2013-08-03T06:46:47.397 回答
0
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)
    {   new BackgroundWorker();
        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;
    }
}
于 2022-01-01T09:54:39.460 回答