Entwickler-Ecke

Basistechnologien - Button einer anderen Control "drücken"


Talemantros - Fr 13.02.15 19:28
Titel: Button einer anderen Control "drücken"
Hallo,
wie http://www.entwickler-ecke.de/topic_Werte+an+andere+UserControl+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


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


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


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:

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 - 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 - Sa 14.02.15 18:02

Super. Danke.
Es ging mir ja hauptsächlich um das Eventargs

Habe es jetzt so


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);
        }