Winforms进度条可见真假

时间:2016-03-20 23:57:53

标签: c# winforms

我的代码有效:

private void textBox1_TextChanged(object sender, EventArgs e)
{
    progressBar1.Visible = true;
}

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

如果我为计算机添加一些内容,如下面的代码示例所示,计算机在完成计算之前不会显示进度条。我想要它做的是首先显示进度条,然后进行计算,然后在其他一些事件上我想隐藏进度条。为什么我不能这样做?

private void textBox1_TextChanged(object sender, EventArgs e)
{
    progressBar1.Visible = true;
    FindPrimeNumber(50000);
}

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

请求的FindPrimeNumber代码:

public int FindPrimeNumber(int n)
{
    int count = 0;
    int a = 2;
    while (count < n)
    {
        int b = 2;
        int prime = 1;// to check if found a prime
        while (b * b <= a)
        {
            if (a % b == 0)
            {
                prime = 0;
                break;
            }
            b++;
        }
        if (prime > 0)
            count++;
        a++;
    }
    return (--a);
}

FindPrimeNumber代码只是使计算机暂时执行任务的一部分,因此我可以测试我的进度条是否会显示。

1 个答案:

答案 0 :(得分:0)

我明白了。在此示例中,用户在文本框中输入一个5位数的数字,然后在表单上显示进度条,因为它正在处理数学函数中的数字,然后将结果放入第二个文本框和进度条走了。

private void textBox1_TextChanged(object sender, EventArgs e)
{
    if (textBox1.TextLength == 5)
    {
        progressBar1.Visible = true;
        int textFromTextBox1 = Int32.Parse(textBox1.Text);
        backgroundWorker1.RunWorkerAsync(textFromTextBox1);
    }
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    e.Result = FindPrimeNumber((int)e.Argument);
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    textBox2.Text = e.Result.ToString();
    backgroundWorker1.CancelAsync();
}

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

注意:此示例不处理所有异常,但效果很好。正如您可能在代码中看到的那样,我将一个值传递给BackgroundWorker,并将其传递给FindPrimeNumber方法,然后我从BackgroundWorker中检索结果。

新手的更多说明:

我将BackgroundWorker属性WorkerSupportsCancellation设置为True。

在WinForms中,在将BackgroundWorker放到表单上之后,当您双击它时,它会为您生成DoWorkEventHandler,然后在解决方案资源管理器中转到事件并双击RunWorkerCompleted以便它可以为您生成好。否则,您将不得不进行大量的手动代码输入。