2009-08-26 5 views
2

Ich habe eine einfache Windows Forms-Anwendung, die ein DataView an eine ListBox bindet. Diese DataView verwendet Linq, um meine DataTable nach einer bestimmten Spalte absteigend zu sortieren. Meine ListBox ist dann an die DataView gebunden. Ich habe dann ein einfaches Formular, um Daten zu der DataTable hinzuzufügen. Wenn ich der DataTable eine DataRow hinzufüge, wird sie in der ListBox angezeigt..Net DataView und DataTable-Bindung

Ich bin neugierig, was hinter den Kulissen los ... I've read:

Ein Dataview-Objekt ist eine angepasste Ansicht eines einzelnen Datentabelle, die gefiltert oder sortiert werden kann. Eine Datenansicht ist der Daten-Snapshot, der von komplex gebundenen -Steuerelementen verwendet wird. Sie können einfach oder Komplex-Bindung an die Daten innerhalb einer Datenansicht , aber beachten Sie, dass Sie Bindung an ein festes "Bild" der Daten eher als eine saubere, Aktualisierung Datenquelle sind.

Ich hätte gedacht, dass, da das DataView ein "Schnappschuss" ist, es nicht automatisch aktualisiert worden wäre. Fügt ein DataView ein Ereignis hinzu, das aktualisiert werden soll, wenn die zugrunde liegende DataTable geändert wird? Versteh mich nicht falsch, so will ich, dass es funktioniert, aber ist das immer so?

Antwort

2

Die DataView ist keine Momentaufnahme. Es wird automatisch und sofort aktualisiert, wenn sich der zugrunde liegende DataTable ändert. Neue Zeilen, die zu DataTable hinzugefügt wurden und die Filterkriterien DataView erfüllen, werden automatisch in DataView angezeigt. In ähnlicher Weise werden Zeilen, die aus der DataTable entfernt wurden, automatisch aus der DataView entfernt.

Im Folgenden wird die dynamische Natur der DataView auch bei Verwendung von LINQ:

using System; 
using System.Linq; 
using System.Data; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DataTable dt = new DataTable(); 
      dt.Columns.Add("FirstName"); 

      var query = from row in dt.AsEnumerable() 
         where row.Field<string>("FirstName").StartsWith("S") 
         select row; 

      DataView view = query.AsDataView(); 

      Console.WriteLine(view.Count); // Prints 0 
      dt.Rows.Add("Sam"); 
      dt.Rows.Add("John"); 
      Console.WriteLine(view.Count); // Prints 1 
      dt.Rows.Add("Sally"); 
      dt.Rows.Add("Mary"); 
      Console.WriteLine(view.Count); // Prints 2 
      dt.Rows.RemoveAt(0); 
      Console.WriteLine(view.Count); // Prints 1 
     } 
    } 
} 

Enthält ein Dataview ein Ereignis hinzuzufügen, zu aktualisieren, wenn die zugrunde liegende Datentabelle geändert wird?

Dies ist ein internes Implementierungsdetail, aber es ist plausibel, dass dies Ereignisse verwendet.

Beachten Sie, dass Sie die DataTable.Copy Methode verwenden können, um eine DataTable zu kopieren, wenn Sie wirklich einen Snapshot der DataTable erstellen möchten.