4 Stimmen

Wie kann man eine Linq2SQL-Sammlung an Winform-Textfelder binden?

Ich bin ein wenig verwirrt, wie ich mein Programm mit Hilfe von DataBindings optimieren kann. Mein Programm verwendet mehrere Linq2SQL gebundene Objekte zum Speichern der Daten. Alle ORM-Objekte werden in einer Hierarchie gespeichert. In einem zweiten GUI-Projekt zeige ich diese Daten in einigen Text- und Combobox-Feldern an.

Die Hierarchie der Datenstruktur sieht wie folgt aus:

  • JobManager enthält ein Wörterbuch der Jobs
  • Jeder Auftrag enthält ein Wörterbuch mit Jobitems
  • Jedes Jobitem enthält genau eine Article

Job , Jobitem y Article sind jeweils Linq2SQL-Objekte, die einen ORM darstellen.

Jetzt habe ich eine grafische Benutzeroberfläche mit 2 Listenansichten und einem Registerkartenbereich. Die Registerkarte zeigt die Eigenschaften von Jobs, Jobitems und Artikeln an und bietet die Möglichkeit, Jobs und Jobitems zu ändern. Die GUI sollte sich wie folgt verhalten:

  1. Wenn ein Job in der ersten ListView ausgewählt wird, werden die zugehörigen Jobitems in der zweiten ListView angezeigt und Detailinformationen über den Job werden im Registerkartenbereich angezeigt.
  2. Wenn ein Jobitem in der zweiten ListView ausgewählt ist, werden die Jobitem-Details und die Artikeldetails im Registerkartenbereich angezeigt, aber nur die Jobitem-Infos sind bearbeitbar.
  3. Wenn Änderungen vorgenommen werden, muss der Benutzer sie absichtlich speichern. Andernfalls sollten die Änderungen verworfen und nicht mit der Datenbank synchronisiert werden.

Wie kann ich dieses Verhalten mit DataBinding erreichen?

Insbesondere kann ich eine komplette Sammlung einmal an ein einzelnes Textfeld binden und durch seine Position, die durch die Auswahl in den ListViews bestimmt wird, verschieben? Oder muss ich für jede Auswahl, die der Benutzer trifft, einzelne DataBindings pro Auftrag hinzufügen und entfernen?

4voto

Marc Gravell Punkte 970173

Meinen Sie wirklich "Wörterbuch"? Winform-Bindung ist OK mit Listen ( IList / IListSource ), aber nicht mit Wörterbuch. Zusätzlich, ListView ist nicht ganz so einfach zu binden wie einige andere Steuerelemente.

Ansonsten sollte es rein über die Mapping-Namen funktionieren - ich werde versuchen, ein einfaches Beispiel zu machen...


Bearbeiten mit grundlegendem Beispiel von Northwind; beachten Sie, dass der Datenkontext idealerweise nicht langlebig sein sollte; Sie können auch Dinge wie Repository-Implementierungen anstelle einer direkten Bindung in Betracht ziehen:

using System;
using System.Windows.Forms;
using SomeNamespaceWithMyDataContext;
static class Program
{
    [STAThread]
    static void Main() {
        MyDataContext ctx = new MyDataContext();
        BindingSource custs = new BindingSource() {
            DataSource = ctx.Customers};

        BindingSource orders = new BindingSource {
            DataMember = "Orders", DataSource = custs};

        Button btn;
        using (Form form = new Form
        {
            Controls = {
                new DataGridView() {
                    DataSource = orders, DataMember = "Order_Details",
                    Dock = DockStyle.Fill},
                new ComboBox() {
                    DataSource = orders, DisplayMember = "OrderID",
                    Dock = DockStyle.Top},
                new ComboBox() {
                    DataSource = custs, DisplayMember = "CompanyName",
                    Dock = DockStyle.Top},                
                (btn = new Button() {
                    Text = "Save", Dock = DockStyle.Bottom
                }), // **edit here re textbox etc**
                new TextBox {
                    DataBindings = {{"Text", orders, "ShipAddress"}},
                    Dock = DockStyle.Bottom
                },
                new Label {
                    DataBindings = {{"Text", custs, "ContactName"}},
                    Dock = DockStyle.Top
                },
                new Label {
                    DataBindings = {{"Text", orders, "RequiredDate"}},
                    Dock = DockStyle.Bottom
                }
            }
        })
        {
            btn.Click += delegate {
                form.Text = "Saving...";
                ctx.SubmitChanges();
                form.Text = "Saved";
            };
            Application.Run(form);
        }
    }
}

Nebenbei bemerkt, ist die Syntax:

DataBindings = {{"Text", orders, "ShipAddress"}}

Ist gleichbedeutend mit:

someTextBox.DataBindings.Add("Text", orders, "ShipAddress");

(Ich füge dies nur hinzu, weil es eine häufig gestellte Frage ist)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X