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

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Fr 13.02.15 19:28 
Hallo,
wie www.entwickler-ecke....l+senden_113951.html hier beschrieben habe ich ein Form, welches 2 USerControls beinhaltet.
Das mit dem Event schreiben, dass wenn der Scan ausgelöst wird das Detailfenster Daten anzeigt funktioniert ja. Dazu hatte ich im oben genannten Beitrag beim Scannen ein Event geworfen, welches von der Form gefangen wurde und diese hat dann im 2ten UserControl die Klasse (bindingSource) gefüllt.

Nun möchte ein Event genau anders herum bauen, welches nach Erledigung im Detailfenster den ScanButton zurück setzt.
Dies habe ich auch gemacht und es funktioniert auch. Würde es gern hier mal zur Diskussion stellen und bitte um Infos ob und was ich anders hätte machen können.

Danke

Code des Events

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
        public class NewEventArgs : EventArgs
        {
            public NewEventArgs()
            {
                          //Bin mir nicht sicher, ob das hier so notwendig gewesen wäre
            }
        }
        
        public event EventHandler<NewEventArgs> newScan; 

        protected virtual void OnNewScan(NewEventArgs e)
        {
            EventHandler<NewEventArgs> ev = newScan;
            if (ev != null)
                ev(this, e);
        }


Code zum Starten des Events

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:
        private void Starten()
        {

                long lagerplatz = ArticleMethods.GetLongStockplaceOfArticle(articleId);

                if (lagerplatz != 0)
                {
                    if (OktabinerMethods.GetStringStockPlaceMerkmal(lagerplatz) == "Hochregal")
                    {
                        ArticleMethods.SetNewStockplaceStatus(lagerplatz, 0);
                    }
                }

                ArticleMethods.UpdateMovementFromArticle(articleId, 0);
                ArticleMethods.UpdateStockplaceFromArticle(articleId, null);

                ArticleMethods.UpdateMachineSetArticle(articleId, null);

                MySqlHistorie.SetHistorie("Bestandsverwaltung", articleId.ToString(), "Bewegung wurde gestartet!", employee);

                MsgAusgabe.ShowInformation("Bewegung erfolgeich gestartet");

                //Event auslösen
                OnNewScan(new NewEventArgs());

        }


In der Form habe ich dann

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
                            controlDetail.newScan += PressButtonReadScan; //Dies am Start der Form



        private void PressButtonReadScan(object sender, WarenrundlaufUserControl.NewEventArgs e)
        {
            controlScan.neu();
        }


Dies ruft dann das ControScan auf und dort die Public Methode neu

Diese führt dann aus:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
        public void neu()
        {
            txtScanfeld.Text = string.Empty;
            txtScanfeld.Focus();
            OnReadScan(new TextEventArgs(string.Empty));
        }


und leert damit das Scanfeld und das Detailfenster.

Wie gesagt funktioniert dies soweit. Es geht mir eher um Anregungen etc.

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: Fr 13.02.15 20:36 
NewEventArgs sind nicht nötig benutz einfach EventArgs direkt. Um die nicht neu erzeugen zu müssen kannst du an den Stellen wo du eine EventArgs Instanz brauchst EventArgs.Empty verwenden.

Denn anderen Code kann ich so leider nicht nachvollziehen (zu viele Bruchstücke die schwer in Zusammenhang zu bringen sind). Falls du den Event als Antwort auf einen Event feuerst um was zurückzumelden sei erwähnt das du im EventHandler auch die EventArgs ändern kannst. Die landen dann wieder beim Aufrufer. Hast du bestimmt schon in einigen Events gesehen wo man zum Beispiel die Cancel Property der EventArgs setzen kann um irgendwas abzubrechen.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Sa 14.02.15 18:02 
Super. Danke.
Es ging mir ja hauptsächlich um das Eventargs

Habe es jetzt so

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
        public event EventHandler<EventArgs> newScan; 

        protected virtual void OnNewScan(EventArgs e)
        {
            EventHandler<EventArgs> ev = newScan;
            if (ev != null)
                ev(this, e);
        }