0

我有下面的代码,它在加载时只显示一个消息文本框:

    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();
    }

我的加载有时需要 2-3 分钟。所以,如果只是显示一个静态消息框,用户可能会认为我的程序可能挂在某个地方。

我想通过在加载时添加进度条来改进这一点。你们能帮帮我吗?

4

1 回答 1

1

大概是这样的吧?

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();
    }
}
于 2013-08-13T02:25:45.387 回答