Laden...

object sender - übergeben an ausgelagerte Klasse

Erstellt von Nisbo vor 8 Jahren Letzter Beitrag vor 8 Jahren 3.141 Views
N
Nisbo Themenstarter:in
21 Beiträge seit 2015
vor 8 Jahren
object sender - übergeben an ausgelagerte Klasse

Ich habe eine ausgelagerte Klasse in der ich gerne den Sender überprüfen will um zu sehen welcher Button geklickt wurde. (Rechtsklick auf Button)

Die schaut so aus

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Delta_Oskar_One
{
    class CallSpeichern
    {
        public static void CallButtonSpeichern(int nummer, string call, object sender, MouseEventArgs e)
        {
            // 
            if (e.Button == MouseButtons.Right && sender == buttonCall1)
            {
                DialogResult result1 = MessageBox.Show(call + " als Call 1 speichern ?", "Call 1 speichern" + sender, MessageBoxButtons.YesNo);
                if (result1 == DialogResult.Yes)
                {
                    //  
                }
            }
        }
    }
}

aufrufen tue ich das im Hauptform im MouseDown des jeweiligen Buttons

        private void button23_MouseUp(object sender, MouseEventArgs e)
        {
            CallSpeichern.CallButtonSpeichern(1, textBox3.Text , sender, e);
        }

Der Code

... && sender == buttonCall1)

funktioniert im Hauptteil aber nicht in der ausgelagerten Klasse, dort bekomme ich als Meldung das buttonCall1 nicht vorhanden ist.

Was ist da falsch gelaufen außer meine eigene Unwissenheit ? Bzw besser gefragt wie bekomme ich das hin das es funktioniert ?

3.003 Beiträge seit 2006
vor 8 Jahren

buttonCall1 ist der Name des Objekts der Klasse Button (?), das Membervariable deines Mainforms ist.

Deine Klasse CallSpeichern weiss nichts von den Buttons der Mainform, und das ist auch gut so [tm].

Du hast mehrere Möglichkeiten.

a) gibt dem Button einen Namen und überprüfe die Gleichheit über


((Button)sender).Name == "DerNameDesButtons"

b) Übergibt der Klasse CallSpeichern eine Referenz auf den Button, so dass sie das Objekt kennt. Nicht schön, denn dann wird CallSpeichern nur mit diesem speziellen Mainform funktionieren.


//CallSpeichern-Klasse
public static Button DerButton { get; set; }

//Mainform
CallSpeichern.DerButton = buttonCall1;

(im übrigen bin ich der Meinung, dass Entwickler ein Halsband tragen sollten, das ihnen beim Tippen der Buchstabenfolge "s-t-a-t-i-c" einen elektrischen Schlag gibt - anderes Thema)

Dritte Möglichkeit: du änderst die Vergleichsmethode so, dass du als Parameter den Button mitgibst, mit dem verglichen werden soll.


//callspeichern
public static /*aua*/ void CallButtonSpeichern(int nummer, string call, Button vergleichsbutton, object sender, EventArgs e)

//Mainform
...
CallSpeichern.CallButtonSpeichern(5, "meincall", buttonCall1, sender, args);

Und viertens gibt's in der FAQ einige längliche Artikel zum Thema "Kommunikation unter Fenstern", die auch in diesem Fall gültig sind.

LaTino
[Edit: Orthografie]

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

J
251 Beiträge seit 2012
vor 8 Jahren

Wenn es unbedingt object sein soll, wäre Typkonvertierung ein Schlagwort in Verbindung mit as bzw. is
und dann sollte sich leicht ermitteln lassen, welcher Button grad sendet.

3.003 Beiträge seit 2006
vor 8 Jahren

Jamikus, das funktioniert nur, wenn der Button eine Eigenschaft hat, anhand derer man ihn vergleichen kann - Name, ID etc.

Wenn so eine Eigenschaft vergeben wäre - obige Variante a) und eigentlich Standardvorgehen.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

N
Nisbo Themenstarter:in
21 Beiträge seit 2015
vor 8 Jahren

thx, ((Button)sender).Name hat das Problem beseitigt 😃

J
251 Beiträge seit 2012
vor 8 Jahren

(

und dann sollte sich leicht ermitteln lassen, welcher Button grad sendet. Das finden der Eigenschaft, die man verwenden will (z.B. Name), wollte ich als Recherche dem TO selbst überlassen 😉 ){gray}

F
10.010 Beiträge seit 2004
vor 8 Jahren

thx, ((Button)sender).Name hat das Problem beseitigt 😃

Nein, es verhindert nur das du

Was ist da falsch gelaufen außer meine eigene Unwissenheit ?

Behebst.

Davon das du irgendwelche Frickel klassen erzeugst, wird deine SW auch nicht besser.
Beschäftige dich mal mit den Grundlagen zu OOP und Pattern.

3.003 Beiträge seit 2006
vor 8 Jahren

Mea culpa.

Lies dir das hier in Ruhe durch. Auch, wenn du zuerst denkst, dass es nichts mit deinem Problem zu tun hat. Danach bist du nicht nur schlauer, du weisst auch, wieso das oben funktioniert hat.

[FAQ] Kommunikation von 2 Forms

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

D
985 Beiträge seit 2014
vor 8 Jahren

Wenn diese statische Methode nur dann abgearbeitet werden soll, wenn die durch den Klick auf diesem einen speziellen Button aufgerufen wurde, dann stellt sich die Frage, warum ist es eine statische Methode in einer anderen Klasse.

Weil das schick ist? Weil man das ja trennen soll?

Ja richtig, aber dann ist es eben auch egal, über welchen Button das ausgelöst wurde. Es wurde ausgelöst und gut. So ein Button taugt als Kontext nicht die Bohne. Wenn du einen Kontext benötigst, dann schick den Kontext mit (KundenId, ...).

Auch die der gedrückte MouseButton interessiert an der Stelle nicht die Bohne. Damit zerrst du Teile der GUI wieder in eine tiefere Schicht hinein.

Was machst du, wenn die Anforderung sich ändert und dieses Speichern über einen Links-Klick auf ein Bild erfolgen soll, aber auch auf den Rechts-Klick eines Labels?

Diese Auswertung erfolgt im UI, dort werden die Eingaben bzw. das Verhalten des Benutzers interpretiert und in ein Kommando umgesetzt, welches dann ausgeführt wird. Es wird dann bei der Ausführung nicht mehr in Frage gestellt, ob es wirklich das Kommando sein sollte, sondern nur noch ob es augeführt werden kann/darf.