-1

什么原因是 myProcessbar1ReportProgress分别只被触发一次?

我第一次单击按钮时,一切都按预期工作。所有进一步的点击一切都还在工作,除了ProgressBar1

我可以在调试器中看到在progressBar1.Value第一次运行时获得预期值,所有进一步的运行progressBar1.Value总是包含“0”。

最奇怪的是它运行foreach-loop,所有东西都被执行,即使b.ReportProgress(i * 100 / x)是正确的值,但没有成功的进度条。
i= 当前循环计数
x= 总循环计数

这是我的代码片段:

BackgroundWorker b = new BackgroundWorker();

    public Form()
    {
        InitializeComponent();

        b.WorkerReportsProgress = true;
        b.DoWork += new DoWorkEventHandler(b_DoWork);
        b.RunWorkerCompleted += new RunWorkerCompletedEventHandler(b_RunWorkerCompleted);
        b.ProgressChanged += new ProgressChangedEventHandler(b_ProgressChanged);
    }

    void b_DoWork(object sender, DoWorkEventArgs e)
    {
        int i = 0;
        int x = xxx.MaxValue;
        foreach (var item in collection)
        {
            //... somecode   ...(item);
            b.ReportProgress(i * 100 / x);
            i++;
        }
        //... somecode
        e.Result = dt;
    }

    void b_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
    }

    void b_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        GridView.DataSource = e.Result;
        GridView.Update();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        b.RunWorkerAsync();
    }

编辑:

    private void btnClearGrid_Click(object sender, EventArgs e)
    {
        dt.Clear();
        GridView.DataSource = dt;
        GridView.Update();
    }

我找到了问题..
问题是我在运行 Backgroundworker 之前尝试清除 Gridview 并且这个btnClearGrid-Click-Event 包含GridView.DataSource = dt;将一个额外的数据源绑定到网格(我认为是这样),而不是清除网格.

    private void btnClearGrid_Click(object sender, EventArgs e)
    {
        dt.Clear();
        GridView.DataSource = null;
    }
4

2 回答 2

1

我遇到了问题,这与更新 ProgressBar 的速度有关,我通过在 DoWork 方法中添加显式线程睡眠来解决这个问题。IE:

 b.ReportProgress(i * 100 / x);
 Thread.Sleep(50);

(还要检查这部分中的 50 毫秒与正在完成的实际工作相比并不算多;如果它只是偶尔报告进度和睡眠)

于 2013-06-18T11:15:11.030 回答
0

尝试在点击之间重置进度条:

private void button1_Click(object sender, EventArgs e)
{
    progressBar1.Value = 0;
    b.RunWorkerAsync();
}
于 2013-06-18T10:57:11.737 回答