none
MenuStrip aus Klasse heraus ändern

    Frage

  • Hallo Forum,

    ich habe einige stand. MenuStrip Funktionen gemacht, die ich in den Forms verwende.

    Diese möchte ich aus einer Klasse heraus ändern / anpassen.

    Es gibt zB. eine ManuStripBasis1, Basis2, Basis3

    an die Klasse übergebe ich die Form

    public void UserMaskenEinstellungenAusfuehren(Control FormEingangX)
       {

         ..

         MenuStrip MS = (MenuStrip)FormEingangX;
          MS.ForeColor = Color.Blue;

       }

    Nun möchte ich den Auswahlpunkt in der Farbe ändern. Aber leider geht es so nicht. Wie muss ich das machen ?

    Weiter möchte ich auch bestimmte Optionen die im Menu vorhanden sind zB. "Kontrolle", "Daten" usw in den Farben

    bei bedarf ändern. Wie kann ich aus der Klasse darauf zugreifen ? Die Namen sind immer gleich.

    Kann mir da jemand helfen ?


    Gruß Roland

    Samstag, 12. Oktober 2013 18:29

Antworten

  • Hallo,
    wenn du deinen Code richtig angewendet hast, dann sollte er auch funktionieren.

            private void xYZToolStripMenuItem1_Click(object sender, EventArgs e)
            {
                TestClass tc = new TestClass();
                tc.SetForeColor(menuStrip1);
            }
            class TestClass
            {
                public void SetForeColor(MenuStrip ms)
                {
                    ms.ForeColor = Color.Green;
                }
            }

    Der Funktion übergebe ich hier direkt das MenuStrip um Fehler zu vermeiden.

    Nun ist es allerdings unschön Control-Instanzen in eine Logik-Klasse zu übergeben.

            private void xYZToolStripMenuItem1_Click(object sender, EventArgs e)
            {
                TestClass tc = new TestClass();
                tc.ChangeMenuStripColor += tc_ChangeMenuStripColor;//Event abonnieren
                tc.SetForeColor(menuStrip1);//Funktion aufrufen
            }
    
            void tc_ChangeMenuStripColor(object sender, EventArgs e)
            {
                menuStrip1.ForeColor = Color.Green;//Farbe setzen. Ggf. Daten 
            }
            class TestClass
            {
                public void SetForeColor(MenuStrip ms)
                {
                    var v = this.ChangeMenuStripColor;
                    if (v != null)//Event abonnieren
                        v(this, EventArgs.Empty);//ggf. eigene EventArgs erstellen und Farbe etc. übergeben
                }
    
                public event EventHandler<EventArgs> ChangeMenuStripColor;//Event erstellen
            }

    Um die einzelnen Items einzufärben, musst du ForeColor der entsprechenden Items setzen. Hier wirkt ForeColor des MenuStrips nicht.

    Wichtig ist, das du die richtigen Instanzen angibst bzw. besser die eventhandler korrekt auswertest.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Roland DE Freitag, 18. Oktober 2013 09:08
    Samstag, 12. Oktober 2013 19:48

Alle Antworten

  • Hallo,
    wenn du deinen Code richtig angewendet hast, dann sollte er auch funktionieren.

            private void xYZToolStripMenuItem1_Click(object sender, EventArgs e)
            {
                TestClass tc = new TestClass();
                tc.SetForeColor(menuStrip1);
            }
            class TestClass
            {
                public void SetForeColor(MenuStrip ms)
                {
                    ms.ForeColor = Color.Green;
                }
            }

    Der Funktion übergebe ich hier direkt das MenuStrip um Fehler zu vermeiden.

    Nun ist es allerdings unschön Control-Instanzen in eine Logik-Klasse zu übergeben.

            private void xYZToolStripMenuItem1_Click(object sender, EventArgs e)
            {
                TestClass tc = new TestClass();
                tc.ChangeMenuStripColor += tc_ChangeMenuStripColor;//Event abonnieren
                tc.SetForeColor(menuStrip1);//Funktion aufrufen
            }
    
            void tc_ChangeMenuStripColor(object sender, EventArgs e)
            {
                menuStrip1.ForeColor = Color.Green;//Farbe setzen. Ggf. Daten 
            }
            class TestClass
            {
                public void SetForeColor(MenuStrip ms)
                {
                    var v = this.ChangeMenuStripColor;
                    if (v != null)//Event abonnieren
                        v(this, EventArgs.Empty);//ggf. eigene EventArgs erstellen und Farbe etc. übergeben
                }
    
                public event EventHandler<EventArgs> ChangeMenuStripColor;//Event erstellen
            }

    Um die einzelnen Items einzufärben, musst du ForeColor der entsprechenden Items setzen. Hier wirkt ForeColor des MenuStrips nicht.

    Wichtig ist, das du die richtigen Instanzen angibst bzw. besser die eventhandler korrekt auswertest.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Roland DE Freitag, 18. Oktober 2013 09:08
    Samstag, 12. Oktober 2013 19:48
  • Hallo Tom,

    Sorry ich hätte noch erwähnen sollen, das ich das ganze im Load der Form mache.

    Im Load  rufe ich eine Klasse auf . Dabei Übergebe ich die Form.

    Dann lade ich in der Klasse einige Tabellen aus einer DB, je nachdem was ich dabei zurück bekomme mache ich

    Änderungen in der Form. Damit der User dies mitbekommt, möchte ich dann die entsprechenden Einträge in MenuStrip farblich kennzeichnen.

    Ich gehe also nicht über einen Klick auf das Menü in die Klasse.

    Mein Problem ist jetzt, wie ich auf den MenuStrip zugreifen kann.


    Gruß Roland

    Samstag, 12. Oktober 2013 20:10
  • Wie ich es beschrieben habe.

    Zwischenfrage: Lädt die Klasse die Daten synchron oder asynchron?
    Falls es asynchron laufen sollte, so muss der Zugriff auf die Controls über Invoke statt finden.
    Mehr dazu hier: http://www.mycsharp.de/wbb2/thread.php?threadid=33113

    Auf jeden Fall würde ich aus der Klasse keinerlei Zugriffe auf Controls machen. Löse einfach ein Event aus, übergebe die Daten in einer Eigenen EventArgs-Klasse (Einfaches Beispiel) und Werte die Daten im Eventhandler aus.

    Nun kannst du natürlich auch die Instanz der Form übergeben und einfach auf die Controls zugreifen.

    Das Load-Event verhält sich nicht anders, als irgend ein Click-Event usw. Zum Zeitpunkt des Auslösens, ist die Form bereits komplett geladen.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Samstag, 12. Oktober 2013 20:34