Gewusst wie: filtern von Daten mithilfe von Entity Framework in einer Weise, dass DataGridView bearbeitet werden und Kontext-änderungen verfolgen?
Ich bin mit C# Windows Form-Anwendung zum Auffüllen von Daten aus sql-server-Datenbank-Tabelle mithilfe von Entity Framework (EFWinForms) mit dem folgenden code :
MyEntityDataModel db = new MyEntityDataModel();
MyEDS = new EntityDataSource();
MyEDS.DbContext = db;
MyDataGridView.DataSource = MyEDS;
MyDataGridView.DataMember = "MyTable";
Funktioniert es einwandfrei. Wenn der Benutzer Bearbeiten,Daten hinzufügen, Daten können gespeichert werden mit dem folgenden code :
MyEDS.SaveChanges();
Möchte ich eine Möglichkeit zum filtern dieser Daten durch Entity-Datenquelle so, dass MyDataGridView bleibt editierbar und alle update gemacht vom Benutzer gefilterten Daten noch Gespeichert werden können zurück zur Datenbank.
Hinweis: Bei der Verwendung von linq to entity Daten filtern, es funktioniert Super, aber es ist einfach füllen Sie einen snapshot der Daten, die nicht bearbeitet oder aktualisiert durch die Nutzer wieder.
InformationsquelleAutor EgyEast | 2016-03-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es einige wichtige Punkte, die Sie berücksichtigen sollten, wenn Sie wollen, um die Arbeit mit entity framework in windows-forms-im verbundenen Modus, wenn Sie möchten, um die
DataGridView
bearbeitbar, auch wenn Sie einen filter anwenden.Eine einzige Instanz von Ihr DbContext
Verwenden eine einzige Instanz Ihrer
DbContext
. Wenn Sie eine neue Instanz erstellen, wenn Sie änderungen speichern, wird die neue Instanz kann nicht sehen, jede änderung, die Sie auf andere Instanz. So erklären es auf form-Ebene:Load Data - Bind Auf die Lokale Speicherung von Entitäten
Beim arbeiten mit Entitäten, die in den Online-Modus, laden von Daten mit
db.Products.Load()
oderdb.Products.ToList()
.Binden Sie Ihre
BindingSource
zudb.Products.Local.ToBindingList()
. Also, wenn Sie hinzufügen oder entfernen von Elementen zu/von binding source, change tracker erkennt änderungen und fügt hinzu oder entfernt Elemente für Sie.Sehen
ToBindingList
Erweiterung Methode addusing System.Data.Entity;
.Wenn das hinzufügen aktiviert ist in Ihrem
DataGridView
werden, dann schalten Sie proxy-Erstellung zu verhindern, dass Ausnahmen beim filtern.Filtern Von Daten Mithilfe Von Linq
Filtern von Daten, mit linq. Sie können nicht verwenden
Filter
Eigenschaft vonBindingSource
wenn die zugrunde liegende Liste istBindingList<T>
; Nur die zugrunde liegenden Listen, die Umsetzung desIBindingListView
interface-Filterung unterstützt.Anwenden-Filterung mit linq. Zum Beispiel:
Filter Entfernen
Filter zu entfernen, setzen Sie einfach die Datenquelle für Ihre verbindliche Quelle für die lokale Speicherung der Entitäten wieder. Auf diese Weise hinzufügen und entfernen funktioniert, wenn Sie filter entfernen.
Hinzufügen/Entfernen/Bearbeiten
Hinzufügen funktioniert nur im ungefilterten Modus. Lassen die Benutzer hinzufügen, Einheiten, filter entfernen.
Bearbeitung wird die Arbeit in beiden, gefilterten oder ungefilterten Modus.
Entfernen funktioniert in gefilterten oder ungefilterten Modus. Aber wenn Sie
BindingNavigator
im gefilterten Modus, Sie können nicht Sie verlassen sich auf Ihre Schaltfläche "löschen". Damit es funktioniert für beide Modus gefiltert und nicht gefilterten Modus sollteDeleteItem
Eigenschaft vonBindingNavigator
zuNone
und Griff zu seinem Element löschen klicken Sie auf Ereignis und schreiben Sie Ihren eigenen code:Entsorgen DbContext auf Entsorgung oder in der Nähe Ihrer Form
Für eine Reale Anwendung betrachten die Entsorgung der
DbContext
auf Entsorgung oder schließen der form:Beispielcode
Unten ist ein Beispiel-code enthält, was ich oben beschrieben habe.
SELECT c1, c2 FROM t1
, dann wird das Ergebnis nicht aktualisiert und update, sollten Sie die Karte, die Spalten manuell auf Datenbank-Spalten. Hier sollte man anzeigen diese Eigenschaften auf Ihre ursprünglichen Elemente.Sie können einfach ausblenden, werden diese Spalten in
DataGridView
. Auch wenn Sie brauchen, können Sie sich bewerben[Browable(false)]
zu jenen Eigenschaften, die zur design-Zeit oder zur Laufzeit.Hallo @Henry, wenn ich verstehe deine Frage richtig, ich denke, dieser Beitrag beantwortet deine Frage: DataGridView CheckBox-Spalte wird nicht für änderungen an den zugrunde liegenden gebundenen Objekts
Sicherlich, wenn das Feld nicht gebunden ist, um Ihr Modell, die Werte des Feldes verloren. Um das problem zu lösen, wenn Sie eine Modell-Klasse fügen Sie eine bool-Eigenschaft, um seine partiellen Klasse. Oder wenn Sie eine DataTable, fügen Sie eine bool-Spalte in der DataTable.
Sicher, ich werde werfen Sie einen Blick auf die beiden Fragen. Vielen Dank für das feedback!
InformationsquelleAutor Reza Aghaei
Während ich nicht sicher bin, von Ihrem möglichen Gebrauch, die ich in der Regel verwenden Sie die filter-Eigenschaft auf eine verbindliche Quelle zu wählen, bestimmte Datensätze, ohne die Fähigkeit, um die Datenbank zu aktualisieren. So etwas wie dieses:
Dann verwenden Sie die bindungsquelle als Datenquelle für die Daten der grid-Ansicht:
Es gibt keinen Punkt, den ich zu verleugnen. Habe ich nicht gelesen, deine Frage gut genug. Sorry für die miss.
InformationsquelleAutor DWR C Sharper