Entwickler-Ecke

WinForms - ToolStripMenuItem.Checked auf ContextMenu nicht übernommen


erfahrener Neuling - Mi 20.12.17 11:05
Titel: ToolStripMenuItem.Checked auf ContextMenu nicht übernommen
Hallo Leute,

folgendes:
Ich habe ein ContextMenu, auf dem sich ein ToolStripMenuItem befindet (beides habe ich mit dem Designer erstellt).
Dass ContextMenu rufe ich über .Show() in einer Event-Methode eines anderen Objekts auf.

Über ein ItemClicked-Event des ContextMenus werden im Code die Checked-Eigenschaften verschiedener ToolStripMenuItems verändert.
Nach Ablauf dieses Events werden aber alle Änderungen verworfen und kein Item auf dem ContextMenu ist ausgewählt.

Frage: Muss ich beim Event oder beim ContextMenu noch irgendeinen Wert setzen, der das Standard-Verhalten abbricht (vgl. e.Cancel von anderen Events)


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
private void contextMenuStripBsp_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    // Alle Haken an Items entfernen
    UncheckAllContextMenuItems();
    // Haken neu setzen
    this.toolStripMenuItemBsp.Checked = true;
}

Gruß Julian

PS: Dasselbe Prinzip funktioniert mit ToolStripMenuItems, die sich in einem MenuStrip befinden.

EDIT: Ich konnte die gewünschte Funktionalität erreichen, indem ich die Checked-bool-Werte der einzelnen Items im ItemClicked-Event in einem Array speichere und diese Werte dann in einem Opening-Event des ContextMenus wieder den einzelnen ToolStripMenuItems (nicht ContextMenu.Items!) zuweise.


Christian S. - Mi 20.12.17 12:23

Hallo,

also irgendwas ist da aber noch komisch. Ich habe das mal nachgebaut. Ein ContextMenu mit entsprechenden Items, keine weiteren Einstellungen verändert. Ein Button öffnet das Menü und der Klick auf das erste Item soll die anderen beiden anhaken. Das tut es auch und der Status bleibt erhalten, auch wenn das Menü zwischendurch geschlossen war.

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void toolStripMenuItem1_Click(object sender, EventArgs e)
        {
            toolStripMenuItem2.Checked = true;
            toolStripMenuItem3.Checked = true;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            contextMenuStrip1.Show(button1, new Point(00));
        }
    }


Grüße
Christian


erfahrener Neuling - Mi 20.12.17 13:01

Danke für den Hinweis! Hab's eben auch nochmal getestet. Bei mir funktioniert das auch, wenn ich für jedes Item ein Clicked-Event mache.

Nur wenn ich im ContextMenu-ItemClicked Event das geklickte Item ermittle und dann direkt anspreche, ist beim nächsten Aufruf gar kein Item gecheckt :nixweiss:


Christian S. - Mi 20.12.17 13:08

Wie ist denn die CheckOnClick-Eigenschaft der Items bei Dir gesetzt?


erfahrener Neuling - Mi 20.12.17 14:07

user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
Wie ist denn die CheckOnClick-Eigenschaft der Items bei Dir gesetzt?

Da hattest du den richtigen Riecher!
Die war bei allen Items auf true gesetzt (weil ich dachte, ansonsten kann man sie gar nicht checken :nut:)

Wenn man bei allen false setzt, funktionierts!