如何在填充 dataGridView 时显示进度?

How to show progress while populating dataGridView?

我正在用给定范围内的随机数填充 datagridview,但是当我生成大量数字时 - 我的程序在生成它们时挂起。这可能会持续一分钟以上(取决于数量)。我知道我可以使用 ProgressBar 显示进度。我试过使用它,但我什么也没有。有使用它的例子吗?

这是我的代码:

private void button1_Click(object sender, EventArgs e)
{
    if (dataGridView1.RowCount > 0) {
        dataGridView1.Rows.Clear();
        dataGridView1.Refresh();
    }

    N = int.Parse(textBox1.Text);
    range_min = int.Parse(textBox2.Text);
    range_max = int.Parse(textBox3.Text);
    numbers = new int[N];
    if (range_max < range_min) MessageBox.Show("Some alert text");
    else if (range_max == range_min) MessageBox.Show("Some alert text");
    else
    {
        dataGridView1.RowCount = N;
        for (int i = 0; i < N; i++)
        {
            numbers[i] = (int)(Math.Round((range_max - range_min) * rndm.NextDouble() + range_min));
            dataGridView1[0, i].Value = numbers[i];
        }
    }
}

您的程序在向 UI 添加数据时“挂起”,因为您正在 UI 线程中执行所有工作,有效地阻塞线程,直到循环完成。所以你需要在一个单独的线程中处理这个繁重的工作。但是您只能从 UI/main 线程更改 UI,所以像这样的事情会引发异常:

    private void button1_Click(object sender, EventArgs e)
    {
        new Thread(() =>
        {
            for (int i = 0; i < 4000; i++)
            {
                dataGridView1.Rows.Add(i.ToString());//throws an exception 
            }
        }).Start();
    }

解决方案是创建一个方法,您可以像这样调用主线程来执行:

    private void button1_Click(object sender, EventArgs e)
    {
        new Thread(() =>
        {
            for (int i = 0; i < 10000; i++)
            {
                this.AddRow(i);
            }
        }).Start();
    }

    public void AddRow(int value)
    {
        if (this.InvokeRequired)
            this.Invoke(new MethodInvoker(() => this.AddRow(value)));
        else
            dataGridView1.Rows.Add(value.ToString());//do your ui update (add row, update progress bar etc..)
        
    }