it-swarm.com.de

Die beste Möglichkeit, DataGridView zu aktualisieren, wenn Sie die Basisdatenquelle aktualisieren

Was ist der beste Weg, ein DataGridView zu aktualisieren, wenn Sie die Basisdatenquelle aktualisieren?

Ich aktualisiere die Datenquelle regelmäßig und wollte dem Benutzer das Ergebnis sofort anzeigen.

Ich habe so etwas gemacht (und es funktioniert), aber das Auslassen von DataGridView.DataSource scheint nicht richtig zu sein.

List<ItemState> itemStates = new List<ItemState>();
dataGridView1.DataSource = itemStates;

for (int i = 0; i < 10; i++) { 
    itemStates.Add(new ItemState { Id = i.ToString() });
    dataGridView1.DataSource = null;
    dataGridView1.DataSource = itemStates;
    System.Threading.Thread.Sleep(500);
}
51
shaunf

Nun, es geht nicht viel besser als das. Offiziell solltest du verwenden

dataGridView1.DataSource = typeof(List); 
dataGridView1.DataSource = itemStates;

Es ist immer noch eine "Clear/Reset Source" -Lösung, aber ich muss noch etwas finden, das die DGV-Datenquelle zuverlässig aktualisiert.

47
Alan

Ich bin selbst darauf gestoßen. Meine Empfehlung: Wenn Sie Eigentümer der Datenquelle sind, verwenden Sie keine List . Verwenden Sie eine BindingList . Die BindingList hat Ereignisse, die ausgelöst werden, wenn Elemente hinzugefügt oder geändert werden, und die DataGridView wird automatisch aktualisiert, wenn diese Ereignisse ausgelöst werden. 

45
GWLlosa

Die sauberste, effizienteste und paradigma-freundlichste Lösung in diesem Fall ist die Verwendung eines System.Windows.Forms.BindingSource als Proxy zwischen Ihrer Liste der Elemente (datasource) und Ihrem DataGridView:

var itemStates = new List<ItemState>();
var bindingSource1 = new System.Windows.Forms.BindingSource { DataSource = itemStates };
dataGridView1.DataSource = bindingSource1;

Verwenden Sie dann beim Hinzufügen von Elementen die Add()-Methode von BindingSource anstelle der Add()-Methode Ihrer Liste:

for (var i = 0; i < 10; i++)
{
    bindingSource1.Add(new ItemState { Id = i.ToString() });
    System.Threading.Thread.Sleep(500);
}

Auf diese Weise fügen Sie Elemente zu Ihrer Liste hinzu und benachrichtigen DataGridView über diese Ergänzungen mit derselben Codezeile. Sie müssen nicht jedes Mal die DataGridView von DataSource zurücksetzen, wenn Sie die Liste ändern.

Es ist auch erwähnenswert, dass Sie ein BindingSource direkt in Forms Designer von Visual Studio in Ihr Formular einfügen und als Datenquelle an Ihr DataGridView anhängen können. Dies erspart Ihnen eine Zeile Code in dem obigen Beispiel, in dem ich es mache manuell.

12

Observablecollection : Stellt eine dynamische Datenerfassung dar, die Benachrichtigungen bereitstellt. __, wenn Elemente hinzugefügt, entfernt oder wenn die gesamte Liste aktualisiert wird Sie können jede Auflistung auflisten, die die IEnumerable-Schnittstelle implementiert. Richten Sie jedoch dynamische Bindungen so ein, dass Einfügungen oder Löschungen in der Sammlung Aktualisieren Sie die Benutzeroberfläche automatisch Die Auflistung muss die INotifyCollectionChanged-Schnittstelle implementieren . Diese Schnittstelle macht das CollectionChanged-Ereignis .__ verfügbar. ein Ereignis, das ausgelöst werden sollte, wenn sich die zugrunde liegende Sammlung ändert.

Observablecollection<ItemState> itemStates = new Observablecollection<ItemState>();

for (int i = 0; i < 10; i++) { 
    itemStates.Add(new ItemState { Id = i.ToString() });
  }
 dataGridView1.DataSource = itemStates;
2
Kashif

Dies ist eine Kopie meiner Antwort von THIS place.

Müssen Sie Datagrid nur noch einmal so füllen:

this.XXXTableAdapter.Fill(this.DataSet.XXX);

Wenn Sie die automatische Verbindung von DataGridView verwenden, erstellen Sie diesen Code automatisch in Form_Load ().

0
starko