У меня есть приложение C# WinForms с элементом управления вкладкой и несколькими вкладками. Одна из вкладок содержит элемент управления сетью данных - в нем всего около 10 элементов, но данные заполняются запросом нескольких серверов и, следовательно, медленно загружаются.Ожидание сообщения при заполнении элемента управления datagrid
Когда я запускаю свое приложение и выбираю вкладку с элементом управления datagrid, приложение, похоже, зависает, пытаясь запросить все серверы и заполнить сетку.
Вместо того, чтобы подвешивать, я хотел бы, чтобы приложение было отзывчивым и для него отображалось сообщение «please wait ...», которое исчезнет после заполнения данных.
То, что я пытался сделать, это создать предпосылки работника как таковые:
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 напрямую, он работает (хотя приложение зависает).
Почему рабочий рабочий рабочий/datagrid не работает?
Вы должны проверить наличие ошибок в событии RunWorkerCompleted в параметре e. Запуск RunWorkerAsync() перед подключением событий просто выглядит странно. Не публиковать ваш PopulateServicesDataGrid не помогает нам помочь вам. – LarsTech
Фоновый работник - отдельный процесс и не отображается в сетке. Запросы к серверу должны быть в фоновом рабочем документе, где работник backgroundwork возвращает DataTable. Затем заполните DataGrid с помощью возвращаемого DataTable. – jdweng
Опубликован PopulationServiceDataGrid. – Brad