none
Häkchen im ToolstripMenu RRS feed

  • Frage

  • Hallo,

    mein kleines Programm kann von Deutsch auf Englisch und zurück per Auswahl im Toolstripmenü umgeschalten werden.

    Ich scheiter nur gerade an der Aufgabe, ein Häkchen vor die jeweilige Sprache zu setzen. Ich weiß, dass es ein bool-Ausdruck ist, jedoch weiß ich nicht, wie ich diesen richtig ausführe.

    using System.Threading;
    using System.Globalization; 
    
           int i = 0;     
    
            public bool Checked { get; set; }
    
            public bool CheckOnClick { get; set; } 
    
    //auf Englisch schalten
            private void EnglishToolStripMenuItem_Click(object sender, EventArgs e)
            {
                _ = englishToolStripMenuItem.Checked;
                _ = englishToolStripMenuItem.CheckState;
                switch (i)
                {
                    case 0:
                        Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
                        i = 1;
    
                        break;
    
                }
                this.Controls.Clear();
                this.InitializeComponent();
            }
            //Auf Deutsch schalten
            private void DeutschToolStripMenuItem_Click(object sender, EventArgs e)
            {
    
                switch (i)
                {
                    case 1:
                        Thread.CurrentThread.CurrentUICulture = new CultureInfo("de");
                        i = 0;
                        break;
    
                }
                this.Controls.Clear();
                this.InitializeComponent();
            }

    Kann mir jemand die Erleuchtung bringen? Ich suche in den Docs von MSDN schon alles durch, jedoch finde ich nicht das richtige.

    Vielen Dank im voraus.

    Liebe Grüße

    Dienstag, 20. August 2019 14:08

Antworten

  • Hi,

    die Checked Eigenschaft dient dazu, das entsprechende Control als angehakt/nicht angehakt darzustellen.

    In deinem Fall also wohl eher:

    englishToolStripMenuItem.Checked = true;

    Was das hier allerdings soll, hab ich nicht verstanden:

    this.Controls.Clear();
    this.InitializeComponent();


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    • Als Antwort markiert Isosek Donnerstag, 22. August 2019 10:22
    Dienstag, 20. August 2019 15:33
    Moderator
  • Hi,

    ein "ToolStrip" kennt von Haus aus keine "Häkchen" oder "Checkboxen".

    Du kannst einen ToolStripButton verwenden und dort die Eigenschaften wie folgt setzen:

    public Form1() {
      InitializeComponent();
      toolStripButton1.CheckOnClick = true;
    }

    Dann wird dir ein Rahmen um den Button gezeichnet, der den Status wiedergeben soll.

    Ein Häkchen sieht aber anders aus. Nun kannst du noch etwas basteln. Falls du deinen Button mit einem Image dekorierst, könntest du dieses Image (etwas Handarbeit erforderlich) so ändern, dass du es mit einer vorangestellten Checkbox kombinierst (also als Grafik -> Composite), einmal mit und einmal ohne Haken.

    Falls du nur Text verwendest (DisplayStyle = Text), kannst auch einfach ein Häkchen als Image einbauen und im Eventhandler einfach den DisplayStyle ändern, etwa wie in folgendem Beispiel:

    private void ToolStripButton1_Click(object sender, EventArgs e) {
      ToolStripButton tsb = (ToolStripButton)sender;
      if (tsb.Checked) {
        tsb.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
      } else {
        tsb.DisplayStyle = ToolStripItemDisplayStyle.Text;
      }
    }

    Im ersten Fall musst du dann einfach das Image austauschen (einmal mit bzw. ohne Häkchen).

    Gruß

    Nachtrag:

    Mir ist gerade aufgefallen, dass du ToolStripMenuItems verwendest, vermutlich in einem SplitButton oder DropDownButton?

    Aus welchem Grund machst du das mit der Checked-Property überhaupt? Und den Switch-Konstruktionen? Würde es nicht auch so gehen (Beispiel für SplitButton):

    private void ToolStripMenuItemDE_Click(object sender, EventArgs e) {
      toolStripSplitButton1.Text = toolStripMenuItem1.Text;
      toolStripSplitButton1.Image = toolStripMenuItem1.Image;
      Thread.CurrentThread.CurrentUICulture = new CultureInfo("de");
    }
    private void ToolStripMenuItemEN_Click(object sender, EventArgs e) {
      toolStripSplitButton1.Text = toolStripMenuItem2.Text;
      toolStripSplitButton1.Image = toolStripMenuItem2.Image;
      Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
    }



    • Bearbeitet K. Pater Mittwoch, 21. August 2019 15:21 Nachtrag...
    • Als Antwort markiert Isosek Donnerstag, 22. August 2019 10:22
    Mittwoch, 21. August 2019 12:37

Alle Antworten

  • Hi,

    die Checked Eigenschaft dient dazu, das entsprechende Control als angehakt/nicht angehakt darzustellen.

    In deinem Fall also wohl eher:

    englishToolStripMenuItem.Checked = true;

    Was das hier allerdings soll, hab ich nicht verstanden:

    this.Controls.Clear();
    this.InitializeComponent();


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    • Als Antwort markiert Isosek Donnerstag, 22. August 2019 10:22
    Dienstag, 20. August 2019 15:33
    Moderator
  • Danke.

    Aber ich bekomme jetzt einen Stack Overflow. Wie verhinder ich diesen jetzt?

    Mittwoch, 21. August 2019 05:42
  • Hi,

    ich hab keine Ahnung, welchen Code Du da irgendwo hast und warum der eine Stack Overflow Exception auslöst. In der Regel kommt das bspw. bei Endlosrekursionen.

    Nur mit dem Code oben kann das nicht passieren. Poste bitte mal auch den relevanten Rest davon. Dazu bitte auch deine Zuweisung der Events zu den Methoden EnglishToolStripMenuItem_Click und DeutschToolStripMenuItem_Click.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Mittwoch, 21. August 2019 06:34
    Moderator
  • Hier mal der komplette Code. Nicht wundern, das Programm berechnet mir etwas und ich speicher und öffne nur 2 Daten.

    namespace Druckberechnung
    {
        public partial class Form1 : Form
        {
            //Variablen kleine Tabelle
            double lpx;
            double lpy;
            double lpflaeche;
            double zylinderdm;
            double zylinderfl;
            double maxdruckhyd;
            double max_ton;
            double maxdrucklp;
            double druck_lp_bd;
            double druck_lp_ber;
            //Variablen große Drucktabelle
            double n20;
            double n40;
            double n80;
            double n160;
            double n320;
            double n350;
            double n300;
            double n250;
            double n200;
            double n150;
            double n100;
            double n50;
            double bhyd20;
            double bhyd40;
            double bhyd80;
            double bhyd160;
            double bhyd320;
            double bhyd350;
            double bhyd300;
            double bhyd250;
            double bhyd200;
            double bhyd150;
            double bhyd100;
            double bhyd50;
    
    
            public Form1()
            {
                InitializeComponent();
    
    
            }
            
    
            public Form1(object fileContent)
            {
    
            }
            int i = 0;
            OpenFileDialog openFile = new OpenFileDialog();
            SaveFileDialog saveFile = new SaveFileDialog();
    
    
            private void Form1_Load(object sender, EventArgs e)
            {
                n20 = Convert.ToDouble(label28.Text);
                n40 = Convert.ToDouble(label35.Text);
                n80 = Convert.ToDouble(label42.Text);
                n160 = Convert.ToDouble(label49.Text);
                n320 = Convert.ToDouble(label56.Text);
                n350 = Convert.ToDouble(label63.Text);
                n300 = Convert.ToDouble(label70.Text);
                n250 = Convert.ToDouble(label77.Text);
                n200 = Convert.ToDouble(label84.Text);
                n150 = Convert.ToDouble(label91.Text);
                n100 = Convert.ToDouble(label98.Text);
                n50 = Convert.ToDouble(label105.Text);
                lp_x.Text = "100";
                lp_y.Text = "100";
                druck_lp.Text = "100";
                stempeldm1.Text = "0";
                max_t.Text = "0";
    
            }
            private void TextBox_GotFocus(object sender, EventArgs e)
            {
                ((TextBox)sender).SelectAll();
            }
    
            private void Button1_Click(object sender, EventArgs e)
            {
                //Konvertierung der Textfelder
                lpx = Convert.ToDouble(lp_x.Text);
                lpy = Convert.ToDouble(lp_y.Text);
                max_ton = Convert.ToDouble(max_t.Text);
                zylinderdm = Convert.ToDouble(stempeldm1.Text);
                druck_lp_bd = Convert.ToDouble(druck_lp.Text);
                //Berechnung der LP Fläche
                lpflaeche = lpx * lpy / 1000;
                //Berechnung der Stempelfläche
                zylinderfl = zylinderdm / 2 * zylinderdm / 2 * 3.1416 / 100;
                //Berechnung des maximalen hydraulischen Druck
                maxdruckhyd = max_ton / zylinderfl * 1000;
                //Berechnung des maximalen Drucks auf LP
                maxdrucklp = max_ton / lpflaeche * 980.67;
                //Berechnung des hydraulischen Drucks bei gewünschten LP Druck
                druck_lp_ber = druck_lp_bd * lpflaeche / zylinderfl / 0.980655;
                bhyd20 = n20 * lpflaeche / zylinderfl / 0.980655;
                bhyd40 = n40 * lpflaeche / zylinderfl / 0.980655;
                bhyd80 = n80 * lpflaeche / zylinderfl / 0.980655;
                bhyd160 = n160 * lpflaeche / zylinderfl / 0.980655;
                bhyd320 = n320 * lpflaeche / zylinderfl / 0.980655;
                bhyd350 = n350 * lpflaeche / zylinderfl / 0.980655;
                bhyd300 = n300 * lpflaeche / zylinderfl / 0.980655;
                bhyd250 = n250 * lpflaeche / zylinderfl / 0.980655;
                bhyd200 = n200 * lpflaeche / zylinderfl / 0.980655;
                bhyd150 = n150 * lpflaeche / zylinderfl / 0.980655;
                bhyd100 = n100 * lpflaeche / zylinderfl / 0.980655;
                bhyd50 = n50 * lpflaeche / zylinderfl / 0.980655;
                komma2();
    
            }
    
            private void komma2()
            {
                //Limitierung und Ausgabe auf 2 Nachkommastellen
                lpquadrat.Text = lpflaeche.ToString("0.##");
                zylinderflaeche.Text = zylinderfl.ToString("0.##");
                max_druck_hyd.Text = maxdruckhyd.ToString("0.##");
                max_druck_lp.Text = maxdrucklp.ToString("0.##");
                druck_hyd.Text = druck_lp_ber.ToString("0.##");
                lbhyd1.Text = bhyd20.ToString("0.##");
                lbhyd2.Text = bhyd40.ToString("0.##");
                lbhyd3.Text = bhyd80.ToString("0.##");
                lbhyd4.Text = bhyd160.ToString("0.##");
                lbhyd5.Text = bhyd320.ToString("0.##");
                lbhyd6.Text = bhyd350.ToString("0.##");
                lbhyd7.Text = bhyd300.ToString("0.##");
                lbhyd8.Text = bhyd250.ToString("0.##");
                lbhyd9.Text = bhyd200.ToString("0.##");
                lbhyd10.Text = bhyd150.ToString("0.##");
                lbhyd11.Text = bhyd100.ToString("0.##");
                lbhyd12.Text = bhyd50.ToString("0.##");
            }
    
    
            //Stmpeldurchmesser und max. Tonnage aus Datei einlesen
            private void DateiÖffnenToolStripMenuItem_Click(object sender, EventArgs e)
            {
    
                if (openFile.ShowDialog() == DialogResult.OK)
                {//Maschinenparameter Textdatei öffnen und lesen
                    var fileName = this.openFile.FileName;
    
                    StreamReader sw = null;
                    try
                    {
                        sw = new StreamReader(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), fileName));
                        stempeldm1.Text = sw.ReadLine();
                        max_t.Text = sw.ReadLine();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                    finally
                    {
                        sw.Close();
                    }
                    foreach (string line in File.ReadAllLines(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), fileName)))
                    {
                        if (line.Length >= 8)
                        {
                            switch (line.Substring(0, 8))
                            {
                                case "Stempel:":
                                    stempeldm1.Text = line.Substring(8);
                                    break;
                                case "Tonnage:":
                                    max_t.Text = line.Substring(8);
                                    break;
    
                            }
    
                        }
                        else
                        {
                            MessageBox.Show("Fehlerhafter Datensatz");
                        }
                    }
                }
            }
            //Stempeldurchmesser und max. Tonnage in Datei speichern
            private void DateiSpeichernToolStripMenuItem_Click(object sender, EventArgs e)
            {
                if (saveFile.ShowDialog() == DialogResult.OK)
                {
                    var savefileName = this.saveFile.FileName;
    
                    StreamWriter sw = null;
                    try
                    {
                        sw = new StreamWriter(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), savefileName));
                        sw.WriteLine("Stempel:" + stempeldm1.Text);
                        sw.WriteLine("Tonnage:" + max_t.Text);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                    finally
                    {
                        sw.Close();
                    }
    
    
                }
    
            }
            //auf Englisch schalten
            private void EnglishToolStripMenuItem_Click(object sender, EventArgs e)
            {
    
                switch (i)
                {
                    case 0:
                        Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
                        i = 1;
    
                        break;
    
                }
    
            }
            //Auf Deutsch schalten
            private void DeutschToolStripMenuItem_Click(object sender, EventArgs e)
            {
                
    
                switch (i)
                {
                    case 1:
                        Thread.CurrentThread.CurrentUICulture = new CultureInfo("de");
                        i = 0;
    
                        break;
    
                }
    
            }
        }
    
    }

    Komischerweise funktioniert die Sprachumschaltung heute nichtmehr. Gestern hat es funktioniert, bevor ich den Thread geschrieben habe. Hatte nur deine Zeile im entsprechenden Event hinzugefügt.

    Edit: Ich benötige die Befehle vom ersten Post this.Controls.Clear(); und this.InitializeComponent(); um die Umschaltung zu machen. 

    Sobald ich den befehl für das Häkchen einsetze, geht es nichtmehr. Im switch wird es nicht eingeschalten und das Programm stürzt ab.

    Fehlt mir noch der CheckedState? Wenn ja, wie gebe ich den richtig an? mit ".CheckedState = Checked;" gibt der mir Fehler aus.

            //auf Englisch schalten
            private void EnglishToolStripMenuItem_Click(object sender, EventArgs e)
            {
               
                switch (i)
                {
                    case 0:
                        Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
                        i = 1;
    
                        break;
    
                }
                englishToolStripMenuItem.Checked = true;
                this.Controls.Clear();
                this.InitializeComponent();
    
            }
            //Auf Deutsch schalten
            private void DeutschToolStripMenuItem_Click(object sender, EventArgs e)
            {
    
    
                switch (i)
                {
                    case 1:
                        Thread.CurrentThread.CurrentUICulture = new CultureInfo("de");
                        i = 0;
                        break;
    
                }
                deutschToolStripMenuItem.Checked = true;
                this.Controls.Clear();
                this.InitializeComponent();
    
            }



    • Bearbeitet Isosek Mittwoch, 21. August 2019 07:53
    Mittwoch, 21. August 2019 07:39
  • Hi,

    ein "ToolStrip" kennt von Haus aus keine "Häkchen" oder "Checkboxen".

    Du kannst einen ToolStripButton verwenden und dort die Eigenschaften wie folgt setzen:

    public Form1() {
      InitializeComponent();
      toolStripButton1.CheckOnClick = true;
    }

    Dann wird dir ein Rahmen um den Button gezeichnet, der den Status wiedergeben soll.

    Ein Häkchen sieht aber anders aus. Nun kannst du noch etwas basteln. Falls du deinen Button mit einem Image dekorierst, könntest du dieses Image (etwas Handarbeit erforderlich) so ändern, dass du es mit einer vorangestellten Checkbox kombinierst (also als Grafik -> Composite), einmal mit und einmal ohne Haken.

    Falls du nur Text verwendest (DisplayStyle = Text), kannst auch einfach ein Häkchen als Image einbauen und im Eventhandler einfach den DisplayStyle ändern, etwa wie in folgendem Beispiel:

    private void ToolStripButton1_Click(object sender, EventArgs e) {
      ToolStripButton tsb = (ToolStripButton)sender;
      if (tsb.Checked) {
        tsb.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
      } else {
        tsb.DisplayStyle = ToolStripItemDisplayStyle.Text;
      }
    }

    Im ersten Fall musst du dann einfach das Image austauschen (einmal mit bzw. ohne Häkchen).

    Gruß

    Nachtrag:

    Mir ist gerade aufgefallen, dass du ToolStripMenuItems verwendest, vermutlich in einem SplitButton oder DropDownButton?

    Aus welchem Grund machst du das mit der Checked-Property überhaupt? Und den Switch-Konstruktionen? Würde es nicht auch so gehen (Beispiel für SplitButton):

    private void ToolStripMenuItemDE_Click(object sender, EventArgs e) {
      toolStripSplitButton1.Text = toolStripMenuItem1.Text;
      toolStripSplitButton1.Image = toolStripMenuItem1.Image;
      Thread.CurrentThread.CurrentUICulture = new CultureInfo("de");
    }
    private void ToolStripMenuItemEN_Click(object sender, EventArgs e) {
      toolStripSplitButton1.Text = toolStripMenuItem2.Text;
      toolStripSplitButton1.Image = toolStripMenuItem2.Image;
      Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
    }



    • Bearbeitet K. Pater Mittwoch, 21. August 2019 15:21 Nachtrag...
    • Als Antwort markiert Isosek Donnerstag, 22. August 2019 10:22
    Mittwoch, 21. August 2019 12:37