Button, ContextMenü, Hintergrundfarbe ändern...

deintag85

Erfahrenes Mitglied
Hallo,
mein Problem ist sicher einfach zu lösen aber irgendwie komm ich nicht darauf.

Ich habe also ein Button. Verknüpft mit einem ContextMenü. Dort kann ich sagen, das sich die Hintergrundfarbe des Buttons, oder Schriftart ändern will.

Mein Problem ist nun die Abfrage des aktuellen Buttons.

Code:
private void hintergrundfarbeÄndernToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ColorDialog MyDialog = new ColorDialog();

            var myButton = (Button)sender;

            MyDialog.AllowFullOpen = false;

            MyDialog.ShowHelp = true;

            MyDialog.Color = myButton.BackColor;

            if (MyDialog.ShowDialog() == DialogResult.OK)
            {
                myButton.BackColor = MyDialog.Color;
            }
        }

Die deklaration von myButton gibt natürlich einen Fehler aus.

An unhandled exception of type 'System.InvalidCastException' occurred in HMI_MenuDesigner.exe

Additional information: Das Objekt des Typs "System.Windows.Forms.ToolStripMenuItem" kann nicht in Typ "System.Windows.Forms.Button" umgewandelt werden.

Klar, das eine hat mit dem anderen nichts zu tun :) Aber wie ermittele ich den aktuellen Button? Ich habe mehrere Buttons bei denen das gleiche passieren soll, also kann ich nicht sagen Button1, Button2.....Ich will das allgemein haben.

Liebe Grüße
 
Ich habe Windows Forms schon lange nicht mehr verwendet (WPF ist meiner Meinung nach die bessere Technologie), aber ein schneller Blick in die Dokumentation lässt mich vermuten, dass die SourceControl-Eigenschaft diejenige ist, die du suchst.

In hintergrundfarbeÄndernToolStripMenuItem_Click ist nicht der Button Sender des Ereignisses, sondern das ToolStripMenuItem, auf das der Benutzer geklickt hat. Wenn ich die Dokumentation richtig verstehe, dann sollte Folgendes funktionieren (nicht getestet!):
C#:
ToolStripMenuItem geklicktesMenuItem = (ToolStripMenuItem)sender;
Button ButtonDerDasMenuStripAufpoppenLies = (Button)geklicktesMenuItem.SourceControl;
// ...
ButtonDerDasMenuStripAufpoppenLies.BackColor = MyDialog.Color;
 
Hmm, hab es jetzt so erweitert aber stoße wieder auf ein kleines Problem. :D

Und zwar

Code:
private void hintergrundfarbeÄndernToolStripMenuItem_Click(object sender, EventArgs e)
        {

            ToolStripMenuItem menuItem = sender as ToolStripMenuItem;
            if (menuItem != null)
            {
                ContextMenuStrip hintergrundfarbeÄndern = menuItem.Owner as ContextMenuStrip;

                if (hintergrundfarbeÄndern != null)
                {
                    Control controlSelected = hintergrundfarbeÄndern.SourceControl;
                }
            }
            
            Button ButtonDerDasMenuStripAufpoppenLies = (Button)controlSelected.SourceControl;

            ColorDialog MyDialog = new ColorDialog();
            //var myButton = (Button)sender;
            MyDialog.AllowFullOpen = false;
            MyDialog.ShowHelp = true;
            //MyDialog.Color = myButton.BackColor;

            if (MyDialog.ShowDialog() == DialogResult.OK)
            {
                //myButton.BackColor = MyDialog.Color;
            }
        }

The name 'controlSelected' does not exist in the current context

Klar, in einer IF-Anweisung ne Variable zu erstellen ist nicht empfehlenswert. Hab dann versucht
vor der IF-Anweisung folgendes zu schreiben.

Code:
            ContextMenuStrip hintergrundfarbeÄndern = null;
            Control controlSelected = null;

Doch dann sagt er, dass diese Variablen bereits in Nutzung sind...

cannot be declared in this scope because it would give a different meaning to 'hintergrundfarbeÄndern', which is already used in a 'parent or current' scope to denote something else

Ich versteh das nicht ganz. Warum geht das nicht obwohl ich den Wert auf NULL setze?

LG
 
Okay, die es funktioniert. Hier die fertige Version.

Code:
private void hintergrundfarbeÄndernToolStripMenuItem_Click(object sender, EventArgs e)
        {

            ToolStripMenuItem menuItem = sender as ToolStripMenuItem;
            ContextMenuStrip hintergrundfarbeÄndern = menuItem.Owner as ContextMenuStrip;
            Button myButton = (Button)hintergrundfarbeÄndern.SourceControl;

            ColorDialog MyDialog = new ColorDialog();
            
            MyDialog.AllowFullOpen = false;
            MyDialog.ShowHelp = true;
            MyDialog.Color = myButton.BackColor;
                        
            if (MyDialog.ShowDialog() == DialogResult.OK)
            {
                myButton.BackColor = MyDialog.Color;
            }
        }

Danke und liebe Grüße :)
 
Zurück