【发布时间】:2016-07-18 23:21:21
【问题描述】:
我有一个带有选项卡控件和多个选项卡的 C# WinForms 应用程序。其中一个选项卡包含一个数据网格控件——它只有大约 10 个元素,但数据是通过查询多个服务器来填充的,因此加载速度很慢。
当我运行我的应用程序并选择带有数据网格控件的选项卡时,应用程序似乎挂起,同时它试图查询所有服务器并填充网格。
我希望应用程序能够响应并显示“请稍候...”消息,而不是挂起,该消息将在填充数据网格后消失。
我试图做的是这样创建一个后台工作人员:
if (tabctrl.SelectedTab == tabctrl.TabPages["tabServices"])
{
this.dgrdServices.RowPrePaint += new DataGridViewRowPrePaintEventHandler(dgrdServices_RowPrePaint);
this.dgrdServices.CellContentClick += new DataGridViewCellEventHandler(dgrdServices_CellClick);
BackgroundWorker bw = new BackgroundWorker();
lblLoading.Visible = true;
bw.RunWorkerAsync();
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
}
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
PopulateServicesDataGrid();
}
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
lblLoading.Visible = false;
}
private void PopulateServicesDataGrid()
{
int x = 0;
foreach (Service Service in Globals.Services)
{
// Add a row to the datagrid for each service
this.dgrdServices.Rows.Add();
// Update the current service status
Service.Status = Service.Query(Service.Server, Service.Name);
if (Service.Status == "running")
{
this.dgrdServices.Rows[x].Cells[0].Value = Properties.Resources.green_dot;
this.dgrdServices.Rows[x].Cells[4].Value = Properties.Resources.stop_enabled;
}
else
{
this.dgrdServices.Rows[x].Cells[0].Value = Properties.Resources.grey_dot;
this.dgrdServices.Rows[x].Cells[4].Value = Properties.Resources.start_enabled;
}
this.dgrdServices.Rows[x].Cells[1].Value = Service.Server.ToUpper();
this.dgrdServices.Rows[x].Cells[2].Value = Service.FreindlyName;
this.dgrdServices.Rows[x].Cells[3].Value = Service.Status;
this.dgrdServices.Rows[x].Cells[5].Value = "Uninstall";
this.dgrdServices.Rows[x].Cells[6].Value = Service.Name;
x++;
}
}
PopulateServicesDataGrid() 包含遍历某些对象并查询多个不同服务器以获取服务状态的代码。
当我尝试运行上述内容时,虽然网格没有被填充。如果我不使用后台工作人员而直接调用 PopulateServicesDataGrid 它确实可以工作(尽管应用程序挂起)。
为什么后台工作人员/数据网格填充不工作?
【问题讨论】:
-
您必须在 e 参数中检查 RunWorkerCompleted 事件中的错误。在连接事件之前运行 RunWorkerAsync() 看起来很奇怪。不发布您的 PopulateServicesDataGrid 对我们没有帮助。
-
后台工作进程是一个独立的进程,不会显示在网格中。对服务器的查询应该在后台工作人员中,后台工作人员返回一个数据表。然后使用返回的 DataTable 填充 DataGrid。
-
PopulateServiceDataGrid 已发布。
标签: c# winforms datagrid backgroundworker