Autor Beitrag
Talemantros
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Do 07.01.16 17:00 
Hallo zusammen,
leider fällt mir für den Titel dieses Eintrags keine genauere Bezeichnung ein, deswegen habe ich es erstmal Allgemein gehalten.
Sollte ein Mod da eine Idee haben, bitte jederzeit ändern.

Ich hatte letztens ja etwas mit Events zu tun und würde da gern auch ein wenig dran bleiben und hatte eine Sache einbauen wollen, von der ich denke, dass man dies mit einem Event machen könnte.

Zur Erklärung:
Ich habe eine Form mit einem UserControl drauf, welches ein DataGridView enthält was Daten anzeigt zur Übersicht.
Diese ist immer aktuell aus der Datenbank ausgelesen.

Nun gibt es aber ein Steuerungsmodul mit einer Form und einem UserControl, welche eine "Ware" bewegen kann.

Dadurch würde sich theoretisch die Ansicht der Form mit der Übersicht ändern.
Beim einem Neustart der Form und einem aktuellen Auslesen geht dies auch.

Nun würde ich gern haben, dass vorausgesetzt die Form mit den Übersichten ist auf, sich diese auch aktualisiert bei Änderungen in der Steuerung.

Da Forms und Controls sich untereinander ja so wenig wie möglich kennen sollten habe ich gedacht ich mache eine Klasse, die das Event beinhaltet.
Dieses werfe ich von der UserControl aus mit der Steuerung und fange es in der UserControl mit der Übersicht.


Dies habe ich wie folgt versucht:
Die Klasse mit dem Event:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
namespace Recycle.Logics
{
    public class ChangeRequestEvent
    {
        public event EventHandler<EventArgs> ChangeRequest;

        public void OnChangeRequest(EventArgs e)
        {
            EventHandler<EventArgs> ev = ChangeRequest;
            if (ev != null)
                ev(this, e);
        }
    }
}


Aufrufen wollte ich dies aus dem UserControl mit der Steuerung

ausblenden C#-Quelltext
1:
2:
                ChangeRequestEvent test = new ChangeRequestEvent();
                test.OnChangeRequest(new EventArgs());


Abonniert habe ich dies in der Form der Übersicht wie folgt:
ausblenden C#-Quelltext
1:
2:
            ChangeRequestEvent test = new ChangeRequestEvent();
            test.ChangeRequest += ChangeUserControlData;


Die auszuführende Methode

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
        private void ChangeUserControlData(object sender, EventArgs e)
        {
            LoadDataGridView(dtpDatumVon.Value, dtpDatumBis.Value);
            MsgBox.MsgAusgabe.ShowError("TEST");
        }


Beim Kompilieren kommen keine Fehler, allerdings passiert auch nichts in der Übersicht.

VG
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 07.01.16 17:54 
Du benutzt 2 verschieden Instanzen der ChangeRequestEvent Klasse zum senden bzw. empfangen. Natürlich sind deren Events unabhängig.
Stell dir vor Events wären so nicht unabhängig. Dann würde z.B. jeder Handler der eine Registrierung an einem Button.Click Event hat jeden Click jeden Buttons in der Anwendung fangen. Wär ziemlich sinnlos ;)
Gefühlt sollten hier aber die Formen nicht miteinander sprechen(Events austauschen). Ich verstehe dich so das beide Formen die gleichen Daten benutzen und wenn die Daten auf einer Form geändert werden soll die andere Form das mitbekommen. Heißt für mich die Datenklasse oder das Datenmodel sollte diesen Event werfen ("den ich hab mich geändert"-Event) und nicht die Form die diese Änderung vorgenommen hat.

Für ein simplen Test ob deine Idee funktioniert könntest du die Klasse und den Event statisch machen. Letztlich glaube ich aber nicht das das die richtige Richtung ist.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Fr 08.01.16 10:25 
Guten Morgen Ralf,
Zitat:

Du benutzt 2 verschieden Instanzen der ChangeRequestEvent Klasse zum senden bzw. empfangen.


Jetzt wo du es so schreibst, könnte ich meinen Kopf auf die Tischplatte hauen :-(
Ok das habe ich verstanden.

Wenn ich nun die Sachen Statisch mache, habe ich das Problem, dass er das Schlüsselwort THIS nicht kennt in dem teil hier

ausblenden C#-Quelltext
1:
2:
3:
            EventHandler<EventArgs> ev = ChangeRequest;
            if (ev != null)
                ev(this, e);  //Hier kommt ein Fehler


Insgesamt wäre dies ja jetzt auch "egal", wenn meine grundsätzliche "Idee" dass die Controls miteinander reden nicht richtig ist.

Zitat:

Ich verstehe dich so das beide Formen die gleichen Daten benutzen und wenn die Daten auf einer Form geändert werden soll die andere Form das mitbekommen


Ja das verstehst du richtig.
Zwar in anderen Weisen, aber die Daten selber sind die gleichen.

Meine dazugehörige Klasse könnte also dieses Event beinhalten?
Da habe ich im Kopf gerade keinen Ansatz.

Ich habe mir die Klassen gerade noch mal angeschaut und befürchte gerade, dass ich da auch wieder was falsch gemacht habe.
Ich habe 2 unterschiedliche Klassen benutzt für die Ansicht im DataGridView und In dem Rundlauf der Ware.

Klasse vom DGV
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
    public class Article
    {
        public long Id { get; set; }
        public long ArticleId { get; set; }
        public long? Customer { get; set; }
        public string CustomerString { get; set; }
        public long? CustomerUnit{ get; set; }
        public string CustomerUnitString { get; set; }
        public long? CustomerTp { get; set; }
        public string CustomerTpString { get; set; }
        public long? CustomerCrap { get; set; }
        public string CustomerCrapString { get; set; }
        public string CrapColor { get; set; }
        public long? Container { get; set; }
        public string ContainerString { get; set; }
        public string ContainerNumberActuell { get; set; }
        public long? ContainerWithout { get; set; }
        public string ContainerWithoutString { get; set; }
        public string ContainerNumber { get; set; }
        public decimal CrapBrutto { get; set; }
        public decimal CrapNetto { get; set; }
        public string Charge { get; set; }
        public long StockPlace { get; set; }
        public string StockPlaceString { get; set; }
        public long ProcessStep { get; set; }
        public string ProcessStepString { get; set; }
        public string ContainerSeperation { get; set; }
}


Klasse vom Rundlauf

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
    public class ArticleView
    {
        public long Id { get; set; }
        public long ArticleId { get; set; }
        public string Customer { get; set; }
        public string CustomerUnit { get; set; }
        public string CustomerTp { get; set; }
        public string CustomerCrap { get; set; }
        public string CrapColor { get; set; }
        public string Container { get; set; }
        public string ContainerNumberActuell { get; set; }
        public string ContainerWithout { get; set; }
        public string ContainerNumberCustomer { get; set; }
        public double CrapBrutto { get; set; }
        public double CrapNetto { get; set; }
        public double CrapTara { get; set; }
        public string Charge { get; set; }
        public string StockPlace { get; set; }
        public string ProcessStep { get; set; }
        public string ContainerSeperation { get; set; }
        public string Movement { get; set; }
        public DateTime InsertAt { get; set; }
        public string InsertFrom { get; set; }
        public List<string> Oktabiner { get; set; }
        public string ArticleReady { get; set; }
    }


Es ist schon länger her, dass ich das gemacht hatte.
Ehrlich gesagt weiß ich nicht mehr warum, und vermutlich wäre es anders besser gewesen bzw. vllt, dass sich die Klassen vererben?

Können wir das Event mal zuusammen versuchen, wie es sein sollte dann würde ich den Rest falls nötig nach und nach hier anpassen! (Betrifft auch andere Klassen) :-(

Danke

Gruß
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 08.01.16 10:40 
Hallo,

nur das event selbst statisch machen, nicht die Methoden, dann kompiliert es auch wieder (alternativ einfach null als 'sender' angeben, sofern dieser nirgendwo benutzt wird oder noch besser den 'sender' von außen an die Methode OnChangeRequest übergeben).

Aber wie Ralf schon geschrieben hat, sollte dies nur ein Vorabversion sein.

Das Ereignis selbst sollte auch nicht in einer eigenen Klasse sein, sondern in der Klasse deklariert und aufgerufen werden, welche das Ereignis auch benutzt (also entweder im UserControl oder aber in der Modellklasse).
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Fr 08.01.16 11:18 
Hallo,
also das hat funktioniert, wenn ich nur das Event static mache.
Soweit so gut. Falsch ist es trotzdem :-)

Zitat:
Das Ereignis selbst sollte auch nicht in einer eigenen Klasse sein, sondern in der Klasse deklariert und aufgerufen werden, welche das Ereignis auch benutzt (also entweder im UserControl oder aber in der Modellklasse).


Zum Verständnis!?:
Die Übersicht mit der Klasse Article soll sich aktualisieren,
wenn der Rundlauf etwas verändert, der die Klasse ArticleView hat.

Müsste das Event dann in der Klasse der Übersicht oder des Rundlaufs sein?

Mir fällt auch gerade auf das meine Bezeichnungen mal wieder keinen Sinn machen, da die Klasse mit VIEW am Ende der Rundlauf ist und nicht die Übersicht. ;-)

Gruß
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 08.01.16 11:58 
Puh das ist jetzt nicht ganz das was ich mit gleichen Daten meinte ;) Gleiche Daten war eher so gemeint das beide Formen auf die gleiche Instanz der Daten schauen. Also beide Formen auf die gleiche Instanz von Article oder ArticleView.

Hängen ArticleView und Article irgendwie direkt logisch zu sammen? Also kann man im Datenmodel so was darstellen wie ArticleView ist der View auf einen bestimmten Article? Und das kann man als Verweis von Article auf ArticleView (oder umgekehrt) darstellen? Wenn der Zusammenhang ArticleView enthält die gleichen Daten wie Article eher etwas ist das nur in deinem Kopf vorhandenen ist und nicht softwaretechnisch nachgebildet wirds eher unschön.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Sa 09.01.16 10:43 
Guten Morgen,

Zitat:

Puh das ist jetzt nicht ganz das was ich mit gleichen Daten meinte ;)


Warum habe ich mir das nur gedacht. :-) Ich glaube das hier wird doch wieder länger wie gedacht, aber ich glaube da kann ich auch wieder viel mitnehmen.

Ich bin gerade irgendwie völlig raus.
Jetzt wollte ich mir alles noch mal ganz genau anschauen, und sehe dass beide UserControls in dem Fall gar nichts mehr mit den Klassen zu tun haben, sondern die nutze ich nur beim Anlegen eines Articles und zum Anschauen eines Articles.

Die Übersicht wird nur über eine DataTable an die BindingSource gepackt. Bild Übersicht
Und der Rundlauf arbeitet nur mit der ID des Articles (die er aus dem Scanfeld zieht) und schreibt diverse Änderung in der Datenbank was sich geändert hat (Beispielsweise Lagerplatz) Bild Rundlauf

Sorry, dass ich da jetzt durcheinander rein gebracht habe.

Gruß
Einloggen, um Attachments anzusehen!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 09.01.16 12:37 
Also wie die UI aussieht ist eigentlich völlig egal ;) Wie das Datenmodel modeliert ist wär hier wichtig.

Benutzen beide UserControls die gleiche Instanz der DataTable? Wenn nicht gibt es ein Muster bzw. eine bestimmte Philosophie im Datenmodel? Oder ist das eher einfach eine Mischung von eigenen Klassen, DataTables etc. die irgendwie zusammenhängen. Also eztwas das verhindert das man sich dem Problem generisch nähert da man an jeder Ecke doch eine andere Lösung braucht da jeder Ecke anders funktioniert?
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: So 10.01.16 13:48 
Hallo Ralf,
Es ist eher eine Mischung aus eigenen Klassen und DataTables...
Mir wäre im Moment nicht mal richtig bewusst wie 2 von einander getrennte UserControls dieselbe Instanz nutzen könnten, wenn ich sie zur Laufzeit des Controls erst anlege und fülle.

Wärst du bereit, dass wir uns von der hier genannten Problematik lösen und es mal so aufbauen, wie es eigentlich sein sollte?
Dann würde ich versuchen dies hier umzusetzen, wenn ich es verstanden habe?

Mir wäre im Moment nicht mal der Anfang klar mit dem Datenmodell noch derselben Instanz.

Danke

Gruß
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 10.01.16 14:22 
Hallo,

daß beide UserControls dieselbe Instanz benutzen, kannst du (wie bei anderen Objekten auch) ganz einfach dadurch sicherstellen, daß du eine Referenz an den Konstruktor (oder per Eigenschaft) übergibst. Und erstellen tust du dann diese Instanz z.B. in der Form, welche die UserControls beinhaltet (oder eben ganz zentral in deinem Hauptprogramm).

Bei jedem new T() in deinem Programmcode solltest du dich immer selbst fragen, ob wirklich ein neues Objekt hier erzeugt werden soll oder ob nicht einfach ein bestehendes Objekt stattdessen hier benutzt werden soll (welches dann eben per Referenz übergeben werden muß).

Ist vllt. für dich noch ein bißchen zu früh (bezogen auf deine Lernphase bzgl. OOP), aber in professionellen Programmen wird fast kein new mehr benutzt, sondern man verwendet dafür Dependency Injection, d.h. man übergibt einem Objekt von außen alle abhängigen Objekte.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: So 10.01.16 15:42 
r
Zitat:
Mir wäre im Moment nicht mal richtig bewusst wie 2 von einander getrennte UserControls dieselbe Instanz nutzen könnten, wenn ich sie zur Laufzeit des Controls erst anlege und fülle.


Irgendwoher muss dein UserControl ja die Daten her haben. Selbst im (fast) einfachsten Fall solltest du die Daten an das UserControl übergeben haben und nicht erst im UserControl erzeugen. Wenn du z.B. per ADO.Net direkt an eine Datenbank gehst im UserControl dann wäre das sicherlich zuerst zu fixen bevor wir auch nur irgendwie versuchen da ein Lösungsmuster drüber zulegen. Dann wäre jetzt die Wiederverwendbarkeit des Usercontrols auch nicht nur leicht eingeschränkt sondern fast gegen null gehend.

Zitat:
Wärst du bereit, dass wir uns von der hier genannten Problematik lösen und es mal so aufbauen, wie es eigentlich sein sollte?


Das ist nicht ganz einfach. Wie es eigentlich sein sollte impliziert es gäbe nur einen eindeutigen Weg. Es gibt aber nur typische Muster bei denen man sich bedienen kann. Die Kombination dieser ist eher offen. Abhängig vom Ziel, den Erwartungen an das wohin sich Software möglicherweise in Zukunft hinbewegt, welcher Aufwand sich überhaupt für diese Sorte Anwendung lohnt und natürlich immer auch welchen Geschmack derjenige der es macht hat ;)

Da wir keine Idee haben was du denn da alles hast, wir kennen nur die Ecken die du hier mal bei eher konkreten Problemen gezeigt hast, weiß ich nicht was da der ~richtige~ Weg ist. Kannst du das Projekt einfach anhängen und in ein paar einfachen Worten sagen was das Ziel ist? Daraus können wir uns eventuell ein Bild machen welche Form von Infrastruktur hilfreich und vor allem machbar wäre von da aus wo du gerade stehst.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Mo 11.01.16 10:41 
Guten Morgen,
erst mal vorne weg vielen Dank für die Erläuterungen.
Da denkt man immer man ist ein Stück weiter und dann kommt doch noch ne Menge nach :-)
ich bin ab heute auch wieder mehr am Rechner, so dass ich auch öfter gucken und schreiben kann.

Mein Projekt anhängen müsste ich klären, da dieses ja hier nebenbei im Rahmen meiner Tätigkeit entsteht (mein Chef hat mich etwas frei gestellt dafür) und teilweise firmeninterne Abläufe beinhaltet.

Könnte man sich als GrundBeispiel was ausdenken? Das hier wäre ein mögliches Beispiel aus meinem Projekt
Beispiel:

Aus einer Hauptform heraus kann man 2 Dinge öffnen
UserControl1: Anlegen eines/mehrere neuen Kunden
UserControl2: Ein Wareneingang bei dem man den Kunden auswählen muss von dem der Schrott kommt.

Wenn das Fenster Wareneingang schon geöffnet ist und man in dem anderen UserControl einen neuen Kunden anlegt, soll im WarenEingangsFenster die Combobox mit möglichen Kunden zum Wareneingang aktualisiert werden.

Gruß

P.S.: Das mit den Referenzen etc schaue ich mir auch direkt noch mal an...
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Di 12.01.16 19:48 
Hallo,
ich habe jetzt mal ein kleines Projekt gemacht/angehängt nach dem Stand wie ich es derzeit programmieren würde.
Könnt ihr euch das mal anschauen und mir helfen, dass so umzubauen, dass die beiden Forms/Controls die selbe Klasse nutzen (ich habe leider keine Idee) und das ÜbersichtenFenster die Erfassung eines neuen Kunden mitbekommt?

Danke

Ich hoffe es ist nachvollziehbar was ich da gemacht habe :-)

VG
Einloggen, um Attachments anzusehen!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 12.01.16 20:34 
A.) Du holst die Daten über eine DataTable
B.) Neu legst du aber über eine eigene Modelklasse und direktes Sql auf der Datenbank an.

Bedeutet natürlich das du wenn du was neu anlegst du die DataTable refreshen mußt. Gefühlt ein unnötiger (langsamer) Roundtrip zur Datenbank.

Entweder du benutzt die DataTable und das schon vorhandene Subsystem mit dem DataAdapter auch zum updaten (Also ein neuer Kunde wird in der DataTable angelegt und über denn DataAdapter gespeichert) oder
du arbeitest ohne DataTable und ersetzt die durch eine List<Kunde> über die du arbeitest. Die jetzige Kombi ist wenig hilfreich.

Edit: Bei einem zweiten Blick

Die Kundenform ist so wenig hilfreich. Möglicherweise ist die nur so weil es ein Testbeispiel ist dann vergiss den Kommentar. Die Form aktiv bestimmen zu lassen was wie angezeigt wird behindert eine sinnvolle Erweiterung. Das will man von außen steuern. Also zum Beispiel ob ein Kunde neu angelegt oder bearbeitet werden soll ist so schwierig möglich. Normalerweise hätte man entweder ein altes oder neues Kunden Objekt reingeschoben und ansonsten gleich belassen hier müsste man aber einen ziemlichen Stalp veranstalten um das hinzubekommen. Falls das ein typisches Muster ist und nicht nur ein TestBeispiel Problem solltest du da umdenken.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Mi 13.01.16 09:21 
Hallo Ralf,
Zitat:
Entweder du benutzt die DataTable und das schon vorhandene Subsystem mit dem DataAdapter auch zum updaten (Also ein neuer Kunde wird in der DataTable angelegt und über denn DataAdapter gespeichert) oder
du arbeitest ohne DataTable und ersetzt die durch eine List<Kunde> über die du arbeitest. Die jetzige Kombi ist wenig hilfreich.

Ich denke es macht Sinn erstmal bei diesem Thema hier zu bleiben und das andere Edit von dir angesprochen dann noch mal anzugehen.
Das Beispiel ist schon so wie ich es mir "erarbeitet" habe anhand von euren Erklärungen etc.

Welchen der beiden Wege würdest du für sinniger erachten?
Bei beiden habe ich noch keine Idee wie das gehen könnte :-)

Danke

Gruß
Daniel
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 13.01.16 20:22 
Zitat:
Welchen der beiden Wege würdest du für sinniger erachten?


Kann ich anhand eines Beispiels nicht entscheiden. Letztlich würde ich vermutlich wenn ich alle Details kennen würden einen 3.ten , 4.ten, 5.ten, n.ten Weg finden und einen dieser wählen. Das würde dir jetzt vermutlich eher weniger helfen ;)

Ich schau mal ob ich dein Beispiel in beide Richtungen geändert bekomme dann kannst du selbst entscheiden was dir einfacher erscheint oder dir besser liegt.

Edit: Beispiel mit eigenem Model angehängt. Das ist jetzt so geschrieben das die Liste nur dann aktualisiert wird wenn beim bearbeiten auf speichern geklickt wird. Alternativ (und einfacher) wäre wenn man jede Änderung sofort sieht dann würde man aber woanders im Grid halt noch ungespeicherte Änderungen sehen können was eher nicht gut ist.

Edit2: Und jetzt mit typisiertem Dataset. Untypisiert wird zum Horror das habe ich mir gesparrt.
Einloggen, um Attachments anzusehen!