Frage

Ich entwickle eine WinForms-Anwendung (.Net 3.5, kein WPF), in der ich Fremdschlüsselsuchen in einem datengebundenen DataGridView anzeigen kann.

Ein Beispiel für diese Art von Beziehung ist, dass ich eine Tabelle mit OrderLines habe.Bestellposten haben eine Fremdschlüsselbeziehung zu Produkten und Produkte wiederum haben eine Fremdschlüsselbeziehung zu Produkttypen.

Ich hätte gerne eine datengebundene DataGridView, in der jede Zeile eine Bestellzeile darstellt und das Produkt und den Produkttyp der Zeile anzeigt.

Benutzer können Bestellzeilen direkt im Raster hinzufügen oder bearbeiten und das Produkt für die Bestellzeile aus einer ComboBoxColumn auswählen. Dadurch sollte dann die Produkttypspalte aktualisiert werden, die den Produkttyp für das ausgewählte Produkt in derselben Zeile anzeigt.

Die beste Lösung, die ich bisher gefunden habe, besteht darin, ein Domänenobjekt einzuführen, das eine Bestellzeile darstellt, und dann die DataGridView an eine Sammlung dieser Bestellzeilen zu binden.Anschließend füge ich Eigenschaften zum Bestellzeilenobjekt hinzu, die das Produkt und den Produkttyp offenlegen, und löse relevante notifypropertychanged-Ereignisse aus, um alles auf dem neuesten Stand zu halten.In meinem Bestellposten-Repository kann ich dann die Zuordnungen zwischen diesem Bestellpostenobjekt und den drei Tabellen in meiner Datenbank verknüpfen.

Das funktioniert auf der Datenbindungsseite, aber die gesamte OR-Zuordnung im Repository manuell codieren zu müssen, scheint schlecht zu sein.Ich dachte, nHibernate könnte bei dieser Verkabelung helfen, habe aber Probleme mit den Zuordnungen aller Fremdschlüssel – sie scheinen einwandfrei zu funktionieren (die Fremdschlüsselsuche für das Produkt eines Bestellpostens erstellt das richtige Produktobjekt basierend auf dem Fremdschlüssel), bis ich Versuchen Sie, die Datenbindung durchzuführen. Ich kann die datengebundenen ID-Spalten nicht abrufen, um meine Produkt- oder Produkttypobjekte zu aktualisieren.

Stimmt mein allgemeiner Ansatz überhaupt?Wenn ja, was ist eine gute Lösung für das Zuordnungsproblem?

Oder gibt es eine bessere Lösung für die Datenbindung von Zeilen, einschließlich der Suche nach Fremdschlüsseln, die ich noch nicht einmal in Betracht gezogen habe?

War es hilfreich?

Lösung

Ich denke, das Problem, das Sie haben, besteht darin, dass es beim Binden an ein Raster nicht ausreicht, INotifyPropertyChanged zu unterstützen, sondern Sie die ListChanged-Ereignisse in Ihrem auslösen müssen IBindingList Implementierung und stellen Sie sicher, dass Sie die überschreiben und „true“ zurückgeben Unterstützt ChangeNotification Eigentum.Wenn Sie hierfür nicht „true“ zurückgeben, sucht das Raster nicht danach, um festzustellen, ob sich die Daten geändert haben.

In .NET 2.0+ können Sie eine generische Sammlung mit erstellen Bindungsliste Klasse, dadurch werden die meisten Unannehmlichkeiten beseitigt (vergessen Sie nur nicht, die SupportsChangeNotification-Eigenschaft zu überschreiben und „true“ zurückzugeben).

Wenn die Klasse, die Sie für die Datenbindung verwenden, über eine Eigenschaft verfügt, die eine Sammlung ist (z. B. IBindingList oder BindingList), können Sie das Fremdschlüsselraster direkt an diese Eigenschaft binden.Wenn Sie die Bindungen im Formulardesigner konfigurieren, wählen Sie einfach die Sammlungseigenschaft als Datenquelle für das Raster aus.Es sollte „einfach funktionieren“.Der einzige heikle Teil besteht darin, sicherzustellen, dass Sie mit leeren oder Null-Sammlungen richtig umgehen.

Andere Tipps

Willkommen bei StackOverflow :)

Normalerweise basieren die Informationen im Dropdown-Menü auf zwei Werten ValueMember und DisplayMember.

Das ValueMember ist die Quelle des tatsächlichen Steuerwerts (dies wird der Schlüsselwert in der Bestellzeile sein), das Anzeigeelement ist der Wert, der dem Benutzer anstelle des Werts angezeigt wird (dies wird der FK-Wert sein).

Gibt es keinen bestimmten Grund, warum Sie nicht einfach alle erforderlichen Daten zurückgeben und diese Eigenschaften festlegen können?

Hier ist ein gutes „How Do I“-Video, das die Datenbindung demonstriert:

http://windowsclient.net/learn/video.aspx?v=52579

Nun, ich weiß nicht, ob es von DataGridView unterstützt wird, aber wenn Sie eine normale WinForms-Datenbindung durchführen (z. B. an eine normale TextBox), können Sie es verwenden Eigenschaftspfade um durch Objektbeziehungen zu navigieren.

Etwas wie das:

myTextBox.DataBindings.Add("Text", anOrderLine, "OrderedPart.PartNumber");

Es wäre sehenswert, ob dies auch in Ihrer Situation funktioniert.

Meine ursprüngliche Frage war offensichtlich nicht klar, tut mir leid.

Das Problem lag nicht in der Datenbindung an eine DataGridView im Allgemeinen oder in der Implementierung einer DataGridViewComboBoxColumn – wie die Leute, die bereits richtig geantwortet haben, sagen, ist das im Web gut dokumentiert.

Das Problem, das ich zu lösen versuche, ist die Aktualisierung von Eigenschaften, die einen Drilldown über Beziehungen durchführen.

Wenn ich in meinem Bestellbeispiel den Wert der Spalte „Produkt“ ändere, wird die Spalte „Produkttyp“ nicht aktualisiert – obwohl ich im Code die Eigenschaft festlege und das NotifyPropertyChanged-Ereignis auslöse.(Im Debug gehe ich an alle richtigen Stellen)

Nach langem Herumstöbern wurde mir klar, dass dies nicht einmal funktionierte, als ich die Eigenschaft „Produkttyp“ der Datenquelle direkt festlegte, sondern sie im Setter „Produkt“ festlegte.

Die andere Sache, von der ich glaube, dass sie mich wieder auf den richtigen Weg bringt, ist, dass alles gut funktioniert, wenn ich eine simulierte Datenzugriffsebene bereitstelle, die im Hauptformular erstellt wurde.

Auch wenn ich die von nHibernate erstellte IList in eine IBindingList kopiere, scheint alles wieder in Ordnung zu sein.

Also Das Problem besteht meiner Meinung nach darin, dass Threading und die NotifyPropertyChanged-Ereignisse bei der Verwendung bestimmter Datenquellen auf bestimmte Weise verloren gehen (ich wünschte, ich könnte genauer sein!)

Ich werde weiterhin nach besseren Möglichkeiten suchen, dieses Problem zu lösen, als die IList in die IBindingList zu kopieren – vielleicht muss ich etwas über Thread-Marshalling lernen.

Bearbeiten

Ich habe jetzt eine Lösung entwickelt, die das Problem löst, und denke, ich verstehe, was mich verwirrt hat – im Grunde scheint es, dass alles andere als die grundlegende Eigenschaftsdatenbindung nicht gut für Listen funktioniert, die nicht von BindingList abgeleitet sind – sobald ich es versucht habe Um eine Datenbindung an Eigenschaften vorzunehmen, die verkettete NotifyPropertyChanged-Ereignisse auslösten, gingen die Dinge durcheinander und meine Ereignisse gingen verloren.

Die Datenzugriffslösung, die ich jetzt habe, verwendet eine Variante von Rob Conery IRepository Muster, das meine zu bindenden Sammlungen als eine von mir erstellte benutzerdefinierte Klasse zurückgibt, eine SortableBindingLazyList, die von BindingList abgeleitet ist, die Sort Core-Methoden implementiert und auch ihre interne Liste als Abfrage speichert, wodurch die Listenmaterialisierung verzögert wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top