Laden...

Änderungen an GUI feststellen

Erstellt von chriss_2oo4 vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.554 Views
C
chriss_2oo4 Themenstarter:in
103 Beiträge seit 2007
vor 13 Jahren
Änderungen an GUI feststellen

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

458 Beiträge seit 2007
vor 13 Jahren

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!

C
chriss_2oo4 Themenstarter:in
103 Beiträge seit 2007
vor 13 Jahren

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

L
416 Beiträge seit 2008
vor 13 Jahren

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.

F
10.010 Beiträge seit 2004
vor 13 Jahren

Würdest Du mit DataBinding und objecten mit ChangeTracking arbeiten ( z.b. eine DataTable ) hättest du das Problem nicht.

R
69 Beiträge seit 2009
vor 13 Jahren

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

C
chriss_2oo4 Themenstarter:in
103 Beiträge seit 2007
vor 13 Jahren

Ihr habt mir sehr geholfen,

vielen Dank für euer Antworten!

Viele Grüße,
Chriss

49.485 Beiträge seit 2005
vor 13 Jahren

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

C
chriss_2oo4 Themenstarter:in
103 Beiträge seit 2007
vor 13 Jahren

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