7

Ich habe eine ToolStrip mit mehreren ToolStripDropDownButton s, jeder hat einen Satz von DropDownItems.Überprüfen Sie nur ein ToolStripMenuItem

Wenn der Benutzer auf ein DropDownItem klickt, wird das Häkchen angezeigt.

enter image description here

Standardmäßig können mehrere Elemente angeklickt werden und daher mehr Häkchen angezeigt.

enter image description here

Was ich versuche zu tun ist, wenn der Benutzer eine DropDownItem klickt, die andere bereits markierte Objekte nicht markiert sein sollte. Mit anderen Worten, in der DropDown-Liste sollte immer nur ein geprüftes Element vorhanden sein.

Ich habe mich schon seit einiger Zeit damit beschäftigt, aber ich kann nicht wirklich herausfinden, wie man das aktuell überprüfte Element behält, während es andere Elemente deaktiviert.

Unten ist der Code, den ich ab sofort habe.

private void subietm1ToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      UncheckOtherToolStripMenuItems(sender); 
     } 

     public void UncheckOtherToolStripMenuItems(object selectedMenuItem) 
     { 
      List<ToolStripDropDownButton> dropdownButtons = new List<ToolStripDropDownButton>(); 
      foreach (ToolStripItem item in toolStrip1.Items) 
      { 
       if (item is ToolStripDropDownButton) 
       { 
        dropdownButtons.Add((ToolStripDropDownButton)item); 
       } 
      } 

      foreach (ToolStripDropDownButton btn in dropdownButtons) 
      { 
       foreach (ToolStripMenuItem d in btn.DropDownItems) 
       { 
        if (d.Checked) 
         d.CheckState = CheckState.Unchecked; 
       } 
      } 
     } 

Wenn jemand etwas Licht auf diesem verschütten könnte oder eine einfache Möglichkeit, sagen Sie mir, darüber zu gehen, würde ich dankbar sein.

Vielen Dank.

+0

http://msdn.microsoft.com/en-us/library/ms404318.aspx –

Antwort

11

So einfach ...

ihre Methode implementieren, wie unten beschrieben:

private void subietm1ToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     UncheckOtherToolStripMenuItems((ToolStripMenuItem)sender); 
    } 

    public void UncheckOtherToolStripMenuItems(ToolStripMenuItem selectedMenuItem) 
    { 
     selectedMenuItem.Checked = true; 

     // Select the other MenuItens from the ParentMenu(OwnerItens) and unchecked this, 
     // The current Linq Expression verify if the item is a real ToolStripMenuItem 
     // and if the item is a another ToolStripMenuItem to uncheck this. 
     foreach (var ltoolStripMenuItem in (from object 
               item in selectedMenuItem.Owner.Items 
              let ltoolStripMenuItem = item as ToolStripMenuItem 
              where ltoolStripMenuItem != null 
              where !item.Equals(selectedMenuItem) 
              select ltoolStripMenuItem)) 
      (ltoolStripMenuItem).Checked = false; 

     // This line is optional, for show the mainMenu after click 
     selectedMenuItem.Owner.Show(); 
    } 

Ein Detail ist, dass Sie die gleiche Methode für alle Klick menuItens implementieren können, für den für Verfahren gleichen Anruf hinzufügen UncheckOtherToolStripMenuItems((ToolStripMenuItem)sender); sehen in der Event-Klick für jeden ToolStripMenuItem, diesem Beispiel zu den zwei weiteren ToolstripMenuItens:

private void subietm2ToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     UncheckOtherToolStripMenuItems((ToolStripMenuItem)sender); 
    } 

    private void subietm3ToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     UncheckOtherToolStripMenuItems((ToolStripMenuItem)sender); 
    } 
+0

Vielen Dank für die Antwort, aber es funktioniert nur für die erste ToolStripMenuItem in der Dropdownlist. – Isuru

+0

Ich habe die Antwort bearbeitet. Wenn Sie Ihren Bedarf erfüllen, bewerten Sie bitte die Frage –

+0

Vielen Dank.Es klappt. Ich habe jedoch ein kleines Problem gesehen. Wenn 'ToolStripSeparator' in der Dropdownliste ist, bekomme ich eine InvalidCastException. _Kann das Objekt vom Typ 'System.Windows.Forms.ToolStripSeparator' nicht in den Typ 'System.Windows.Forms.ToolStripMenuItem' geschrieben werden ._ Haben Sie Vorschläge, dem entgegenzuwirken? Danke noch einmal. :) – Isuru

1

ich nur setzen alle Elemente in meinem Menü mit dem Ereignis von item_Click. Wenn also einer geklickt wird, wird nur der folgende Code ausgeführt. Sie brauchen auf diese Weise kein Ereignis für jede Schaltfläche.

private void item_Click(object sender, EventArgs e) 
    { 
     // Set the current clicked item to item 
     ToolStripMenuItem item = sender as ToolStripMenuItem; 
     // Loop through all items in the subMenu and uncheck them but do check the clicked item 
     foreach (ToolStripMenuItem tempItemp in (ToolStripMenuItem)item.OwnerItem.DropDownItems) 
     { 
      if (tempItemp == item) 
       tempItemp.Checked = true; 
      else 
       tempItemp.Checked = false; 
     } 
    } 

Wenn Sie während der Laufzeit mehrere Elemente zu Ihrer Liste hinzufügen und diese wie oben beschrieben verbinden möchten, können Sie den folgenden Code ausführen.

0

Sie könnten die Zählung erhalten, indem Sie in ein Array kopieren und dann Erweiterungen verwenden.

ToolStripItem[] controls = new ToolStripItem[ToolStrip.DropDownItems.Count]; 
ToolStrip.DropDownItems.CopyTo(controls,0); 
intcheckCount = controls.Count(c => (c as ToolStripMenuItem).Checked); 

if (checkCount == 0) // must keep 1 selection 
    item.Checked = true; 
else if (checkCount > 1) //uncheck all others 
    controls.Cast<ToolStripMenuItem>().Where(c => c.Checked && c.Name != item.Name) 
     .ToList().ForEach(s => s.Checked = false); 
0

Ich habe eine andere Art und Weise, die funktioniert:

Jedes Element zu ToolStripMenuItem_CheckStateChanged(object sender, EventArgs e) wird und jedes Element hat seinen eigenen Tag 1, 2, 3, 4, 5. Ein Element wird beim Start überprüft und hat tag = 1.

int selecteditem = 1; 
    bool atwork = false; 
    private void dzienToolStripMenuItem_CheckStateChanged(object sender, EventArgs e) 
    { 
     if (atwork) return; 
     else atwork = true; 

     selecteditem = Convert.ToInt32(((ToolStripMenuItem)sender).Tag); 

     foreach (ToolStripMenuItem it in sometooltipdropdown.DropDownItems) 
     { 
      if (Convert.ToInt32(it.Tag) != selecteditem) 
      { 
       it.Checked = false; 
      }     
     } 

     atwork = false; 
    } 
Verwandte Themen