C# 线程操作 DataGridView 控件:Invoke 和 BackgroundWorker 详解
在 C# 中操作 DataGridView 控件的线程方法有两种:
- 使用 Invoke 方法
在线程中操作 UI 控件是非法的,因此我们需要使用 Invoke 方法将 UI 操作委托到 UI 线程中执行。以下是一个示例:
private void UpdateDataGridView(object obj)
{
// 获取数据集
List<Data> dataList = (List<Data>)obj;
// 使用 Invoke 方法更新 DataGridView
if (dataGridView1.InvokeRequired)
{
dataGridView1.Invoke(new Action(() =>
{
dataGridView1.Rows.Clear();
foreach (Data data in dataList)
{
dataGridView1.Rows.Add(data.Name, data.Age, data.Gender);
}
}));
}
else
{
dataGridView1.Rows.Clear();
foreach (Data data in dataList)
{
dataGridView1.Rows.Add(data.Name, data.Age, data.Gender);
}
}
}
在上面的示例中,我们使用 Invoke 方法将 DataGridView 的更新操作委托给 UI 线程执行。如果当前线程不是 UI 线程,则使用 Invoke 方法,否则直接执行更新操作。
- 使用 BackgroundWorker 组件
BackgroundWorker 是一个可以在后台执行任务的组件,它可以帮助我们在后台线程中执行耗时的操作,同时还可以方便地更新 UI 控件。以下是一个示例:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// 获取数据集
List<Data> dataList = (List<Data>)e.Argument;
// 更新 DataGridView
dataGridView1.Rows.Clear();
foreach (Data data in dataList)
{
dataGridView1.Rows.Add(data.Name, data.Age, data.Gender);
}
}
private void UpdateDataGridView(List<Data> dataList)
{
// 设置 BackgroundWorker 的参数
backgroundWorker1.RunWorkerAsync(dataList);
}
在上面的示例中,我们将 DataGridView 的更新操作放在 BackgroundWorker 的 DoWork 事件处理程序中。在 UpdateDataGridView 方法中,我们调用 RunWorkerAsync 方法来启动 BackgroundWorker,并将需要更新的数据集作为参数传递给它。在 DoWork 事件处理程序中,我们可以使用 e.Argument 属性获取传递的参数,并在其中执行 DataGridView 的更新操作。在更新操作完成后,BackgroundWorker 会自动触发 RunWorkerCompleted 事件,在该事件处理程序中可以进行一些清理工作。
原文地址: https://www.cveoy.top/t/topic/nYYP 著作权归作者所有。请勿转载和采集!