2011-06-17 7 views
6

Me gustaría tener una tira de herramientas con algunos botones (WinFroms/C# /. Net4). Me gustaría que se marcara el botón y todos los demás sin marcar, por lo que quiero que solo se marque el botón y todos los demás sin marcar.Tira de herramientas con botón de verificación grupo

Sé que el botón de la tira de herramientas se ha marcado en la propiedad de clic, pero cuando hago clic en un botón, también se pueden marcar otros. En el viejo VB6 existía una solución automática para este problema: buttongroup en la barra de herramientas. ¿Hay alguno similar en Winfoms?

¿O debería manejarlo desde el código? ¿Cambia el resto de los botones al estado desmarcado cuando se marca un botón? Si es así, entonces no sería mi solución favorita ...

Respuesta

10

Llame a este código en la herramienta EventosStripButton_Click y debería obtener el resultado deseado.

foreach (ToolStripButton item in ((ToolStripButton)sender).GetCurrentParent().Items) 
    { 
     if (item == sender) item.Checked = true; 
     if ((item != null) && (item != sender)) 
     { 
      item.Checked = false; 
     } 
    } 
+0

Thx, sé que ... pensé que había una solución más directa para la tira de herramientas ... – Tom

-1

No lo he hecho un poco, pero si utiliza un cuadro de grupo alrededor de los botones de opción, solo permitirá que se compruebe uno a la vez.

+1

No son casillas de verificación regulares, son botones de la tira de herramientas en una tira de taburete – Tom

1

No estoy al tanto de una manera de hacer esto en el diseñador, pero es bastante fácil de hacer en código:

readonly Dictionary<string, HashSet<ToolStripButton>> mButtonGroups; 

... 

ToolStripButton AddGroupedButton(string pText, string pGroupName) { 
    var newButton = new ToolStripButton(pText) { 
     CheckOnClick = true 
    }; 

    mSomeToolStrip.Items.Add(newButton); 

    HashSet<ToolStripButton> buttonGroup; 
    if (!mButtonGroups.TryGetValue(pGroupName, out buttonGroup)) { 
     buttonGroup = new HashSet<ToolStripButton>(); 
     mButtonGroups.Add(pGroupName, buttonGroup); 
    } 

    newButton.Click += (s, e) => { 
     foreach (var button in buttonGroup) 
     button.Checked = button == newButton; 
    }; 

    return newButton; 
} 
2

supongo que esto es una cuestión de edad, sin embargo yo estaba buscando para una solución a este problema también y terminó haciendo una especie de ToolStripRadioButton extendiendo ToolStripButton. El comportamiento debe ser el mismo que el de un botón de radio normal, hasta donde puedo ver. Sin embargo, he agregado una identificación de grupo para que sea posible tener múltiples grupos de botones de opción dentro de la misma tira de herramientas.

uno puede agregar el botón de radio a un toolstrip como un ToolStripButton normales:

Add RadioButton

botón para realzar el botón más provecho cuando se verifica que he dado un gradiente de fondo (CheckedColor1 a CheckedColor2 de arriba hacia abajo):

Checked RadioButton gradient background

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Drawing.Drawing2D; 
using System.Linq; 
using System.Windows.Forms; 

public class ToolStripRadioButton : ToolStripButton 
{ 
    private int radioButtonGroupId = 0; 
    private bool updateButtonGroup = true; 

    private Color checkedColor1 = Color.FromArgb(71, 113, 179); 
    private Color checkedColor2 = Color.FromArgb(98, 139, 205); 

    public ToolStripRadioButton() 
    { 
     this.CheckOnClick = true; 
    } 

    [Category("Behavior")] 
    public int RadioButtonGroupId 
    { 
     get 
     { 
      return radioButtonGroupId; 
     } 
     set 
     { 
      radioButtonGroupId = value; 

      // Make sure no two radio buttons are checked at the same time 
      UpdateGroup(); 
     } 
    } 

    [Category("Appearance")] 
    public Color CheckedColor1 
    { 
     get { return checkedColor1; } 
     set { checkedColor1 = value; } 
    } 

    [Category("Appearance")] 
    public Color CheckedColor2 
    { 
     get { return checkedColor2; } 
     set { checkedColor2 = value; } 
    } 

    // Set check value without updating (disabling) other radio buttons in the group 
    private void SetCheckValue(bool checkValue) 
    { 
     updateButtonGroup = false; 
     this.Checked = checkValue; 
     updateButtonGroup = true; 
    } 

    // To make sure no two radio buttons are checked at the same time 
    private void UpdateGroup() 
    { 
     if (this.Parent != null) 
     { 
      // Get number of checked radio buttons in group 
      int checkedCount = this.Parent.Items.OfType<ToolStripRadioButton>().Count(x => x.RadioButtonGroupId == RadioButtonGroupId && x.Checked); 

      if (checkedCount > 1) 
      { 
       this.Checked = false; 
      } 
     } 
    } 

    protected override void OnClick(EventArgs e) 
    { 
     base.OnClick(e); 
     this.Checked = true; 
    } 

    protected override void OnCheckedChanged(EventArgs e) 
    { 
     if (this.Parent != null && updateButtonGroup) 
     { 
      foreach (ToolStripRadioButton radioButton in this.Parent.Items.OfType<ToolStripRadioButton>()) 
      { 
       // Disable all other radio buttons with same group id 
       if (radioButton != this && radioButton.RadioButtonGroupId == this.RadioButtonGroupId) 
       { 
        radioButton.SetCheckValue(false); 
       } 
      } 
     } 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     if (this.Checked) 
     { 
      var checkedBackgroundBrush = new LinearGradientBrush(new Point(0, 0), new Point(0, this.Height), CheckedColor1, CheckedColor2); 
      e.Graphics.FillRectangle(checkedBackgroundBrush, new Rectangle(new Point(0, 0), this.Size)); 
     } 

     base.OnPaint(e); 
    } 
} 

Quizás útil a los demás también.

Cuestiones relacionadas