如何在填充 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..)
}
我正在用给定范围内的随机数填充 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..)
}