3 Stimmen

Datenbindung von berechneten Eigenschaften in Entity Framework

Ich versuche, einen effektiven Weg zu finden, um berechnete Felder eines Entity Framework-Modells in Winforms databind. Ich verwende Visual Studio 2008 und .NET Framework 3.5. Ein Beispiel wäre für EntityX, sagen wir, ich habe columnA und columnB, und ich möchte eine berechnete Eigenschaft namens sumAB. Die Art und Weise, wie ich dies getan habe, war mit partiellen Klassen:

public partial class EntityX 
{
    public int sumAB 
    {
        get 
        {
            return this.columnA + this.columnB;
        }
    }
}

Dann verwende ich Visual Studio, um EntityX als Datenquelle hinzuzufügen, damit ich die automatische Datenbindung per Drag & Drop nutzen kann. Das Problem, das ich habe ist, dass die berechneten Eigenschaften nicht unter den Datenquellenfeldern angezeigt werden. Ich bin auf der Suche nach einer Möglichkeit, die automatische Datenbindung von berechneten Feldern zu haben.

Ich weiß, ich könnte dies manuell tun, aber dann müsste ich auch manuell alle der Bindung Code schreiben, um das Feld zu aktualisieren, wenn SpalteA oder SpalteB geändert werden. Ich habe auch keinen Zugriff auf dieses Feld auf der SQL-Server-Seite berechnet entweder zu machen.

Kennt jemand eine Möglichkeit, dies zu erreichen, oder eine andere ähnliche Richtung, die man einschlagen könnte?

Danke!

UPDATE

Ich habe dies auf einem anderen Rechner mit Visual Studio 2010 und .NET 4 getestet und erhalte immer noch das gleiche Verhalten. Interessanterweise kann ich manuell ein Textfeld erstellen und eine Datenbindung hinzufügen, und es wird gut funktionieren, wie unten:

sumABTextBox.DataBindings.Add(
  new System.Windows.Forms.Binding("Text", EntityXBindingSource, "sumAB", true));

Es funktionierte auch, wenn ich die Eigenschaft in der .edmx-Datei platzierte, aber das ist nicht wünschenswert, da sie jedes Mal gelöscht wird, wenn die Datenbank aktualisiert wird.

Haben Sie eine andere Idee?

UPDATE 2

Immer noch keine Lösung... Ich musste in meinem Code Alternativen verwenden, um die Fristen einzuhalten. Ich bin immer noch sehr daran interessiert, wenn jemand eine Antwort findet...

1voto

Bernoulli IT Punkte 4798

Das klingt für mich seltsam. Denn ich verwende den gleichen Ansatz in meinem Projekt (Entity Framework, Self Tracking Entities, WCF, Winforms).

Ich konstruierte eine einfache Winforms applciation, um es zu testen und die "berechnete" Eigenschaft zeigt nur in der databindings.Text-Eigenschaft eines Textfeld-Steuerelements.

Ich habe eine einfache Klasse erstellt:

public partial class Test
{
    public int A { get; set; }
    public int B { get; set; }

    public Test()
    {
    }
}
public partial class Test
{
    public int AB
    {
        get { return A * B; }
    }
}

Einem Formular wurde eine Bindungsquelle hinzugefügt (mit einer Datenquelle, die auf ein Objekt vom Typ Test zeigt) und drei Textfelder, die an die Bindungsquelle und die Eigenschaften gebunden sind: A, B und AB. Im Konstruktor des Formulars erstellte ich eine Instanz von Test, füllte Werte für A und B ein, setzte bindingsource.DataSource auf die erstellte Instanz und dachte, das Formular sei groovy ;)

Dieser einfache Testfall würde sich nicht von Ihrer Situation unterscheiden, außer dass Sie mit Entitäten arbeiten, die natürlich nur Objekte sind. Aus Ihrer Beschreibung kann ich das Problem wirklich nicht erkennen... Weitere Kommentare könnten mir helfen, Ihnen weiterzuhelfen...

1voto

Chad Punkte 3000

Ich habe gestern im Grunde die gleiche Frage gestellt (WPF, nicht WinForms). Anzeigen der berechneten Eigenschaft in Entity Framework und WPF UI .

Kurzum, ich konnte keine automatische Unterstützung finden. Ich musste die Spalten in meinem DataGridView für jede berechnete Eigenschaft erstellen. Um dann dem DataGridView mitzuteilen, dass diese Eigenschaften aktualisiert wurden, muss ich OnPropertyChanged("ComputedPropertyName") in der OnChanged-Teilmethode aufrufen.

z.B..

public partial class Test
{
    public int AB
    {
        get { return A * B; }
    }

    public partial void OnAChanged()
    {
        OnPropertyChanged("AB");
    }
    public partial void OnBChanged()
    {
        OnPropertyChanged("AB");
    }
}

Wenn es eine automatische Methode gibt, mit der dies funktioniert, würde ich das auch gerne wissen.

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