Ich habe eine C# WinForms-Anwendung mit einem Tab-Steuerelement und mehrere Registerkarten. Eine der Registerkarten enthält ein Datenraster-Steuerelement - es enthält nur etwa 10 Elemente, aber die Daten werden durch Abfragen mehrerer Server aufgefüllt und laden sich daher langsam auf.Warte Nachricht beim Auffüllen eines DataGrid-Steuer
Wenn ich meine Anwendung ausführen und die Registerkarte mit dem DataGrid-Steuerelement auswählen, scheint die Anwendung zu hängen, während sie versucht, alle Server abzufragen und das Raster zu füllen.
Anstatt aufzuhängen, möchte ich, dass die Anwendung reagiert und eine "Bitte warten ..." - Meldung anzeigt, die verschwindet, nachdem das Datagrid aufgefüllt wurde.
Was ich versucht habe, einen Hintergrund Arbeiter als solcher zu tun zu schaffen ist:
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() enthält Code, der iteriert durch einige Objekte und Abfragen mehrere verschiedene Server für den Service-Status.
Wenn ich versuche, obiges auszuführen, wird das Raster jedoch nicht ausgefüllt. Wenn ich keinen Hintergrund-Worker verwende und PopulateServicesDataGrid direkt aufruft, funktioniert es (obwohl die App hängt).
Warum funktioniert der Hintergrundarbeiter/Datagrid nicht?
Sie müssen im e-Parameter nach Fehlern im RunWorkerCompleted-Ereignis suchen. Das Ausführen von RunWorkerAsync() vor dem Anhängen der Ereignisse sieht einfach komisch aus. Wenn Sie Ihr PopulateServicesDataGrid nicht posten, helfen Sie uns nicht weiter. – LarsTech
Der Hintergrund-Worker ist ein separater Prozess und wird nicht im Raster angezeigt. Die Abfragen an den Server sollten im Hintergrund-Worker sein, wo der Hintergrundarbeiter eine DataTable zurückgibt. Füllen Sie anschließend das DataGrid mit der zurückgegebenen DataTable aus. – jdweng
PopulateServiceDataGrid veröffentlicht. – Brad