如何使用户控件表现为单选按钮

时间:2009-11-27 19:35:23

标签: c# .net winforms

我正在开发标签按钮作为用户控件,我怎样才能让它像radiobutton一样工作。 “当用户在组中选择一个选项按钮(也称为单选按钮)时,其他按钮会自动清除”。谢谢。

5 个答案:

答案 0 :(得分:4)

假设您的自定义标签按钮控件名为MyTabButton, 覆盖并实现Equals,和 然后在自定义控件类的Click事件处理程序中

if (this.Checked)
   foreach(Control myBut in Parent.Controls)
       if (myBut is MyTabButton && !myBut.Equals(this))
          myBut.Checked = false;

答案 1 :(得分:2)

如果您想要单选按钮的行为,请使用单选按钮。

使用javascript隐藏单选按钮并创建标签按钮代替原始单选按钮。将单击事件从标签按钮提供给原始单选按钮。您可能还希望有一个公共事件来取消选择其他选项卡按钮。

<击>

如果禁用了javascript,您的按钮也会很好地降级。

由于您已经提到过您使用的是winforms而不是使用Javascript,因此您可以覆盖派生的RadioButton类的paint方法,以将Radiobutton绘制为选项卡。这是一个基本的例子

public class ButtonRadioButton : RadioButton {

    protected override void OnPaint(PaintEventArgs e) {
        PushButtonState state;
        if (this.Checked)
            state = PushButtonState.Pressed;
        else
            state = PushButtonState.Normal;

        ButtonRenderer.DrawButton(e.Graphics, e.ClipRectangle, state);
    }

}

答案 2 :(得分:1)

显然你需要一个按钮容器,每当选择一个usercontrol时,将事件激活到容器,容器取消选择另一个usercontrol

答案 3 :(得分:0)

需要更多信息,如果这是WindowsForms,WPF,ASP.NET等..但

如果是WPF,我写了一篇帖子,解释了我解决这个问题的方法: Grouping and Checkboxes in WPF

答案 4 :(得分:-1)

已编辑以包含答案

您可以通过重写OnClick或OnMouseClick事件来实现它。我没有通过“清除按钮”得到你的意思,所以我只是改变它的Backcolor。您可以轻松地根据您的财产或其他需求进行调整。

using System;
using System.Linq;
using System.Windows.Forms;

namespace StackOverflow
{
    public partial class FormMain : Form
    {
        public FormMain()
        {
            InitializeComponent();
        }
    }

    public partial class MyRadioButton : Button
    {
        //Override OnClick event. - THIS IS WHERE ALL THE WORK IS DONE
        protected override void OnClick(EventArgs e)
        {
            do
            {
                /*
                    This is where you select current MyRadioButton. 
                    I'm changing the BackColor for simplicity. 
                */
                this.BackColor = System.Drawing.Color.Green;

                /*
                   If parent of current MyRadioButton is null, 
                   then it doesn't belong in a group.
                */
                if (this.Parent == null)
                    break;

                /*
                    Else loop through all other MyRadioButton of the same group and clear them. 
                    Include System.Linq for this part.
                */
                foreach (MyRadioButton button in this.Parent.Controls.OfType<MyRadioButton>())
                {
                    //If button equals to current MyRadioButton, continue to the next RadioButton
                    if (button == this)
                        continue;

                    //This is where you clear other MyRadioButton
                    button.BackColor = System.Drawing.Color.Red;
                }
            }
            while (false);

            //Continue with the regular OnClick event.
            base.OnClick(e);
        }
    }
}

enter image description here