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 ?
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)
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.
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)
(
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}
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.
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)
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.