简体   繁体   English

在C#中加载时产生进度条

[英]Producing a progress bar while loading in C#

I have the below code which just shows a message text box while loading: 我有以下代码,仅在加载时显示消息文本框:

    private void button3_Click_1(object sender, EventArgs e)
    {
        int i;
        BackgroundWorker bw = new BackgroundWorker();

        bw.WorkerReportsProgress = true;
        bw.WorkerSupportsCancellation = true;
        bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);

        msgForm = new Form2();  //Form2 is showing a message "Please Wait..."

        try
        {
                bw.RunWorkerAsync(comboBox15.Text);

                msgForm.StartPosition = FormStartPosition.CenterParent;
                msgForm.ShowDialog();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }


    void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        string PrtAdd = e.Argument.ToString();

        Loading(PrtAdd); //This is the function of my loading.
    }

    void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        msgForm.Close();
    }

My loading will sometimes takes 2-3 minutes. 我的加载有时需要2-3分钟。 So, if just show a static message box, probably the user will think maybe my program is hang somewhere. 因此,如果只显示一个静态消息框,则用户可能会认为也许我的程序挂在某个地方。

I would like to improve this by adding a progress bar while loading. 我想通过在加载时添加进度条来改善这一点。 Can you guys help me? 你们能帮我吗?

Something like this, perhaps? 大概是这样吗?

public partial class Form1 : Form
{
    private Form2 _frm2;

    public Form1() {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var bw = new BackgroundWorker();
        bw.WorkerReportsProgress = true;
        bw.WorkerSupportsCancellation = true;
        bw.DoWork += BwOnDoWork;
        bw.RunWorkerCompleted += BwOnRunWorkerCompleted;
        bw.RunWorkerAsync();

        _frm2 = new Form2(bw);
        _frm2.StartPosition = FormStartPosition.CenterParent;
        _frm2.ShowDialog();
    }

    private void BwOnRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs runWorkerCompletedEventArgs)
    {
       if (_frm2 != null)
       {
           _frm2.Close();
       }
    }

    private void BwOnDoWork(object sender, DoWorkEventArgs doWorkEventArgs)
    {
        var bw = sender as BackgroundWorker;
        var i = 0;
        while (i < 100 && !bw.CancellationPending)
        {
            bw.ReportProgress(i);
            Thread.Sleep(100);
            i++;
        }
    }
}

public partial class Form2 : Form
{
    private BackgroundWorker _bw;

    public Form2() {
        InitializeComponent();
    }

    public Form2(BackgroundWorker bw) : this()
    {
        _bw = bw;
        _bw.ProgressChanged += BwOnProgressChanged;
    }

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

    private void button1_Click(object sender, EventArgs e) {
        _bw.CancelAsync();
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM