Hi,
ich habe eine Eingabemaske mit sehr vielen Feldern. Damit der Benutzer seine vielen Eingaben nicht versehentlich verwerfen kann, möchte ich eine Abfrage ála Word, Paint, etc. (Speichern vor Schließen) erstellen.
Dazu fange ich das Closing-Event des Fensters ab und zeige eine Messagebox die dem Benutzer die o. g. Frage stellt.
Allerdings ist es momentan so, dass diese Frage immer kommt, auch wenn keine Änderungen vorgenommen wurden.
Ich hätte es aber gerne so, dass ein Flag gesetzt wird, wenn der User eine Änderung an einem der vielen Feldern vornimmt.
Gibt es dafür eine komfortable Lösung, oder müsste ich für jede Komponente einen Eventhandler bereitstellen, der Änderungen prüft?
Danke & viele Grüße
Chriss
Du koenntest einen gemeinsamen EventHandler, den jedes deiner Felder abonniert fuer das TextChanged-Event implementieren, in dem du dann ein Flag setzt, welches du im Closing-Event abfragst.
be the hammer, not the nail!
Danke für Deine Antwort!
...aber ich verstehe nicht ganz; Was ist dann der Vorteil, gegenüber der Varieante in der ich gleich die jeweiligen Events nutze um das Flag zu sezten?
Außerdem sind es nicht nur Textfelder, sondern z. B. auch List- und Check-Boxen
viele Grüße,
Chriss
Der Vorteil ist einfach der, dass du bei x Controls einen Hanlder hast anstatt x. Wäre ja eh jedesmal der gleiche Code. Bei verschiedenen Controls musst du wohl jeweils einen Handler pro Controltyp bereitstellen.
Würdest Du mit DataBinding und objecten mit ChangeTracking arbeiten ( z.b. eine DataTable ) hättest du das Problem nicht.
Hallo,
wir haben das Problem gelöst, indem wir einen Eventhandler im Fachobjekt definiert haben, das die Oberfläche abbonnieren kann.
Dazu habe wir eine Klasse definiert, von der alle Fachobjekte erben und folgenden Code implementiert:
[Serializable()]
public class MODBase : INotifyPropertyChanged
{
protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArg(propertyName));
}
}
#region INotifyPropertyChanged Member
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
In der Unterklasse wird jede Property mit folgenden Code versehen:
public long UrsprungsID
{
get { return ursprungsID; }
set
{
if (ursprungsID != value)
{
ursprungsID = value;
[B] OnPropertyChanged("UrsprungsID");[/B] }
}
}
In der Oberfläche wird der Event abonniert:
modRolleKopie.PropertyChanged += new PropertyChangedEventHandler(modRolleKopie_PropertyChanged);
So können wir darauf reagieren, wenn sich das Fachobjekt geändert hat.
Vielleicht kannst Du was damit anfangen
Gruß Ron
Ihr habt mir sehr geholfen,
vielen Dank für euer Antworten!
Viele Grüße,
Chriss
Hallo zusammen,
die Frage, ob überhaupt Änderungen erfolgt sind, trifft nur eine begrenzte Aussage über die Frage, die eigentlich relevant ist, nämlich ob die Daten zum Zeitpunkt des Aufruf des Forms sich von den Daten zum aktuellen Zeitpunkt unterscheiden. Denn zwei Änderungen können sich ja gegenseitig aufheben.
Deshalb ist es die beste Lösung, den Zustand zum Zeitpunkt des Aufruf des Forms zu sichern (z.B. Memento) und beim Schließen des Forms mit dem aktuellen Zustand zu vergleichen.
herbivore
Das ist schon richtig, dass man Änderungen aufheben kann und dann den Dialog nicht zeigen müsste, aber mMn. ist das für meine Anwendung nicht notwendig. Bei diversen MS Programmen wird im Übrigen auch nicht darauf geachtet.
Aber trotzdem Danke für die Anmerkung!
Gruß,
chriss