DataGridView nicht selbst aktualisieren, wenn die Aktualisierung aus einem anderen thread
Ich habe ein problem beim aktualisieren DataGridView
aus einem anderen thread. Lassen Sie mich erklären. Wenn Benutzer klickt auf eine Schaltfläche auf einem Formular muss ich zum Auffüllen des Rasters mit einigen Zeilen. Dieser Prozess dauert einige Zeit, also mache ich es in einem separaten thread. Bevor der thread ich DataGridView.Enabled
Eigenschaft false
, um zu verhindern, dass Benutzer von der Bearbeitung von Artikeln, während Sie, die Hinzugefügt wird, und nur vor den arbeiten-thread endet, ich Enabled
zurück true
.
Das problem ist DataGridView
nicht aktualisieren Sie Ihre Inhalte richtig, wenn Bildlaufleisten angezeigt werden müssen. Ich werde verdeutlichen dies mit einem screenshot:
Wie Sie sehen können, die Letzte sichtbare Zeile ist teilweise gezeichnet und die DataGridView
nicht nach unten scrollen. Wenn ich die Größe des Rasters, so dass es selbst aktualisieren, werden alle Zeilen angezeigt werden, in der Regel.
Hier einige code:
private void button1_Click(object sender, EventArgs e)
{
string[] fileNames = new string[] { "file1", "file2", "file3" };
Thread AddFilesToListThread = new Thread(ThreadProcAddRowsToGrid);
dataGridView1.Enabled = false;
AddFilesToListThread.Start(fileNames);
}
delegate void EmptyDelegate();
private void ThreadProcAddRowsToGrid(object fileNames)
{
string[] files = (string[])fileNames;
foreach (string file in files)
{
EmptyDelegate func = delegate
{
dataGridView1.Rows.Add(file);
};
this.Invoke(func);
}
EmptyDelegate func1 = delegate
{
dataGridView1.Enabled = true;
};
this.BeginInvoke(func1);
}
Habe ich auch bemerkt, dass nur Enabled
- Eigenschaft bewirkt, dass dieses seltsame Verhalten. Ändern, zum Beispiel BackgroundColor
funktioniert einwandfrei.
Könnten Sie mir helfen zu sehen, wo das problem ist?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie versucht
DataGridView.Refresh()
Vielleicht festlegen des readonly-Eigenschaft anstelle von dataGridView1.Enabled = true;?
Alternativ, ich denke, dies kann gelöst werden, durch die Trennung der Daten von der Benutzeroberfläche.
Sieht es für mich so, dies ist ein Vereinfachtes Beispiel für SO hier, aber wenn du kannst, würde ich vorschlagen, ersetzen die gleichwertig Linie;
mit
Dann können Sie auch aktualisieren Sie die Daten mit ResetBindings auf die BindingSource;
Refresh()
nach der Aktivierung des Rasters, aber es wird nicht helfen.Enabled
- Eigenschaft ändert, funktioniert alles einwandfrei.dataGridView1.Enabled = true;
?ReadOnly
funktioniert einwandfrei. Der Nachteil ist, ich habe einige readonly Zeilen im raster und nach der EinstellungReadOnly = false
für die Gitter werde ich mal schauen, durch alle Reihen und setzenReadOnly = true
für Sie.BindingSource
Vorschlag?dataGridView.ScrollBars = ScrollBars.None; dataGridView.Enabled = true; dataGridView.ScrollBars = ScrollBars.Both;
ich werde hier posten, wenn ich versuche, Ihre Lösung.