Laden...

DataBinding: Suche Event u.ä., wenn die Bearbeitung eines Datensatzes abgeschlossen ist

Erstellt von MorphieX vor 12 Jahren Letzter Beitrag vor 12 Jahren 3.205 Views
Thema geschlossen
M
MorphieX Themenstarter:in
184 Beiträge seit 2012
vor 12 Jahren
DataBinding: Suche Event u.ä., wenn die Bearbeitung eines Datensatzes abgeschlossen ist

Hi,

vorweg: ich bin ganz neu hier und versuche mich gerade an C#.
Ich komme aus der Delphi und VB6 Ecke und möchte mich jetzt selbst weiterbilden.

Kleinere Sachen kann ich schon, doch jetzt möchte ich mich mit Datenbanken / Databinding beschäftigen.

Ich habe also die Trial-Version vom Visual Studio 2010, eine Firebird-Datenbank und den Firebird ADO.NET Data Provider.
Ich habe meine Datenbank jetzt mittels Entity Framework gemappt und kann auch wunderbar auf meine Daten zugreifen / Filtern usw. Das klappt also.

Dann habe ich eine "neue Datenquelle" aus einem "Objekt" hinzugefügt, auch das klappt. Wenn ich jetzt z.B. die Datenquelle auf eine WinForm ziehe, wird ein Grid mit den ganzen Spalteninformationen erstellt. Soweit ok.

Wenn ich der BindingSource dann eine Liste zur Laufzeit zuweise, stehen auch tatsächlich die entsprechenden Daten im Grid.

Außer dem Grid ziehe ich dann noch eine beliebige Eigenschaft der Datenquelle auf die Form, z.B. das Feld "KundenNr" als TextBox.
In dieser TextBox wird mir jetzt immer die KundenNr des aktuell im Grid selektierten "Datensatzes" angezeigt.

Das sind also meine Basics.

Jetzt das Problem: ich möchte auf eine Änderung der Datenquelle reagieren, genauergesagt möchte ich vor einem "Datensatz"-wechsel überprüfen, ob ggf. der Text im Feld KundenNr geändert wurde.
Wenn ja, soll der Anwender gefragt werden, ob der Datensatz vorher gespeichert werden soll.

Mein Problem besteht also darin, ein Event zu finden, welches mir signalisiert, dass ein Datensatzwechsel ansteht. (am Besten noch mit einer Möglichkeit, den Vorgang abzubrechen)

Leider bietet mir die BindingSource keinerlei Events an, auf die ich reagieren könnte. Aus anderen Programmiersprachen kenne ich es, dass mir die Datenquelle diverse Events bereitstellt, z.B. "AfterUpdate", "BeforeInsert", "BeforeRowColChange",.....

Wie macht man soetwas also in C#?
Ich könnte sowas natürlich ins Grid packen (ich glaube das bietet solche Events), aber das muss doch irgendwo zentral ablaufen können, oder nicht?
Was, wenn ich gar nicht mit einem Grid arbeiten möchte?

Wie macht ihr sowas?
Habe mir schon diverse Tutorials und Videos angesehen, aber entweder geht es um WPF (da verstehe ich bislang noch gar nichts) oder es wird gar nicht erwähnt, wie man auf soetwas reagiert.

Ich hoffe ich konnte mich zumindest ein bisschen verständlich ausdrücken g und freue mich auf eure Antworten. 😃
Danke

F
10.010 Beiträge seit 2004
vor 12 Jahren

BindingSource.PositionChanged ist nichts für dich?

M
MorphieX Themenstarter:in
184 Beiträge seit 2012
vor 12 Jahren

Nee, da ist der Vorgang ja schon abgeschlossen.
ich will ja vorher fragen, ob die Änderungen gespeichert werden sollen, bzw. den Vorgang ggf. abbrechen oder sowas...

F
10.010 Beiträge seit 2004
vor 12 Jahren

Leider bietet mir die BindingSource keinerlei Events an, auf die ich reagieren könnte. Aus anderen Programmiersprachen kenne ich es, dass mir die Datenquelle diverse Events bereitstellt, z.B. "AfterUpdate", "BeforeInsert", "BeforeRowColChange",.....

Andere Programmiersprachen haben andere Herangehensweisen.
Bei VB6 und Delphi war ein BeforeInsert und co notwendig, weil du ja direkt in der Datenbank gearbeitet hast.
Bei .NET ( verwechsele bitte nicht das Framework und die Sprache die du benutzt ) arbeitest du aber disconnected, also ist nach dem Datensatzwechsel noch überhaupt nichts in der DB passiert und du kannst dann genau das machen was Du machen willst, nämlich entweder auf Nachfrage die Änderungen speichern oder aber auch wieder im Speicher rückgängig machen.

Du solltest dich lösen von den Ideen der anderen Sprachen und deiner bisherigen Vorgehensweisen.

M
MorphieX Themenstarter:in
184 Beiträge seit 2012
vor 12 Jahren

also ist nach dem Datensatzwechsel noch überhaupt nichts in der DB passiert und du kannst dann genau das machen was Du machen willst, nämlich entweder auf Nachfrage die Änderungen speichern oder aber auch wieder im Speicher rückgängig machen.

Und wie genau reagiere ich dann darauf? Es muss doch irgendeine möglichkeit geben, in den mechanismus gezielt einzugreifen. Oder wie macht ihr sowas?

Du solltest dich lösen von den Ideen der anderen Sprachen und deiner bisherigen Vorgehensweisen.

Das habe ich vor, aber irgendwie glaube ich, noch etwas elementares noch nicht verstanden zu haben. Habe aber schon sehr viel gelesen, nur kommt mir da im Moment keine Idee

F
10.010 Beiträge seit 2004
vor 12 Jahren

Wenn der Datensatz gewechselt wird ist doch noch nichts passiert, insofern ist dann das PositionChanged in der Bindingsource vollkommen ok.

Und wenn deine Objekte IEditableObject implementieren reicht ein .CancelEdit().

Ansonsten kannst du aber auch den Context benutzen um an die Orginalwerte zu kommen.
Hierzu musst du nur eine Partielle Class zu deiner "dazu" machen.


    public class State
    {
        public int Id { get; set; }
        public string state { get; set; }
        public string capital { get; set; }
        public bool visited { get; set; }
        public void CancelEdit(StateContext context)
        {
            state = context.Entry(this).Property(s => s.state).OriginalValue;
            capital = context.Entry(this).Property(s => s.capital).OriginalValue;
            visited = context.Entry(this).Property(s => s.visited).OriginalValue;
        }
    }
    public class StateContext: DbContext
    {
        public DbSet<State> States { get; set; }
    }

Das lässt sich auch ganz einfach per T4 automatisieren.

p.s.:
Nur so runtergeschrieben.

M
MorphieX Themenstarter:in
184 Beiträge seit 2012
vor 12 Jahren

Erstmal vielen Dank für deine Antworten.

Aber ich glaube ich hab das Problem noch nicht ausreichend beschrieben.
Ich stelle mir das so vor:
Ich habe ein TabControl mit mindestens zwei Pages.
Auf der 1. Page (Übersicht) befindet sich ein Grid mit mehreren Kontakten
Auf der 2. Page (Details) befinden sich diverse Eingabecontrols, die die entsprechenden Felder eines Kontaktes anzeigen, also z.B. Kundennr, Name, Straße, PLZ,...

Wenn ich jetzt im Grid einen Kontakt auswähle, werden die Eingabecontrols auf der 2. Page automatisch ausgefüllt (über Bindings)

Der Benutzer kann nun die Eingaben (z.B. die Straße) ändern und auf Speichern klicken.
Alternativ kann der Benutzer wieder zu Page 1 wechseln und einen anderen Kontakt aufrufen.
Hier soll das Programm jetzt merken "Aha, der Kontakt wurde aber geändert!" und soll einen Dialog anzeigen "Möchten Sie die Änderungen speichern? Ja, Nein, Abbrechen".

Bei Ja sollen die Änderungen gespeichert werden, so als wenn man direkt auf "Speichern" geklickt hätte. (SaveChanges wahrscheinlich)
Bei Nein sollen die Änderungen rückgängig gemacht werden (CancelEdit wahrscheinlich)
Und bei Abbrechen soll der Wechsel des Kontaktes unterdrückt werden. Es soll also wieder / immernoch der angezeigte Kontakt ausgewählt sein (Current)

Und genau beim Wechsel des Kontaktes habe ich das Problem. Ich finde keine Möglichkeit, VOR dem Wechsel abzufragen, ob die Änderungen gespeichert werden sollen.

5.742 Beiträge seit 2007
vor 12 Jahren

Alternativ kann der Benutzer wieder zu Page 1 wechseln und einen anderen Kontakt aufrufen. Hier soll das Programm jetzt merken [...]

Naja - dann ist in deiner Situation also der Wechsel der Tabpage das Event, auf das du hören musst.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo MorphieX,

wir drehen uns hier unnötig im Kreis. Alles nötige ist bereits gesagt.

Dein Problem ist immer noch, dass du daran klebst, ein Event zu finden, dass vor dem Wechsel bzw. vor den Änderungen ausgelöst wird. FZelle hat dir schon erklärt, dass DataBinding so nicht funktioniert. Änderungen schlagen immer sofort auf die gebunden Daten durch. Du musst also ein Event danach verwenden und dann die Änderungen ggf. rückgängig zu machen. Wenn du dich nicht darauf einlässt, wirst du ewig hängen.

Dem Benutzer kann es doch vollkommen egal sein, wie es intern technisch realisiert sind, also ob eine Änderung der gebundenen Daten verhindert (geht nicht) oder rückgängig gemacht wird (geht).

Wenn es dir nur darum geht, den Wechsel der TabPage zu verhindern: Dafür gibt es entsprechende Events.

herbivore

Thema geschlossen