Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
object sender - übergeben an ausgelagerte Klasse
Nisbo
myCSharp.de - Member



Dabei seit:
Beiträge: 21

Themenstarter:

object sender - übergeben an ausgelagerte Klasse

beantworten | zitieren | melden

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 ?
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3062
Herkunft: Thüringen

beantworten | zitieren | melden

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]
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von LaTino am .
"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)
private Nachricht | Beiträge des Benutzers
Jamikus
myCSharp.de - Member



Dabei seit:
Beiträge: 251
Herkunft: Oberhausen (NRW)

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3062
Herkunft: Thüringen

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers
Nisbo
myCSharp.de - Member



Dabei seit:
Beiträge: 21

Themenstarter:

beantworten | zitieren | melden

thx, ((Button)sender).Name hat das Problem beseitigt :)
private Nachricht | Beiträge des Benutzers
Jamikus
myCSharp.de - Member



Dabei seit:
Beiträge: 251
Herkunft: Oberhausen (NRW)

beantworten | zitieren | melden

Zitat
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 ;)
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10083

beantworten | zitieren | melden

Zitat
thx, ((Button)sender).Name hat das Problem beseitigt :)
Nein, es verhindert nur das du
Zitat
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.
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3062
Herkunft: Thüringen

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 996

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers