如何将自定义控件中的单选按钮组合在一起?

时间:2013-09-24 22:19:02

标签: winforms c#-4.0 radio-button custom-controls grouping

我有一个自定义控件(不是组件)基于一个单选按钮,它有一个花哨的标签,当选择标签时会发出绿光,黑色时不能提供更好的视觉反馈,为什么不呢。

为了证实我的恐惧,我在表格上放了一堆并运行它,当然,它们不被认为是“组合在一起”,因为我可以激活所有这些并且其他任何一个都没有停用。

我如何能够使这些控件成为“特殊单选按钮组”的一部分并且表现为正常的单选按钮?

1 个答案:

答案 0 :(得分:0)

好的,所以我找到了“A”解决方案。我不知道它是否是一个理想的解决方案,但它确实有效。

我找到了“CheckedChanged”事件的对象功能。问题在于,无论是手动还是以编程方式完成,都会触发此问题。 解?使用“Clicked”事件。但不只是按钮,整个事情。

所以我们得到的是:

namespace Pieces{
public partial class ucGraphicLabelRadioButton : UserControl{
    private event EventHandler _CheckedChanged;

    /// <summary>
    /// Gets or sets the controls text.
    /// </summary>
    public override string Text{
        get{return this.lblTitle.Text;}
        set{lblTitle.Text = value;}
    }
    /// <summary>
    /// Gets or sets the checked state of the button.
    /// </summary>
    public bool Checked{
        get{return this.rbtnButton.Checked;}
        set{this.rbtnButton.Checked = value;}
    }

    public event EventHandler CheckedChanged{
        add{this._CheckedChanged += value;}
        remove{this._CheckedChanged -= value;}
    }

    public ucGraphicLabelRadioButton(){
        InitializeComponent();
    }

    //This is where the fancy stuff happens...
    private void ToggleCheck(object sender, EventArgs e){
        this.lblTitle.GlowColor = Color.Green;
        bool FoundOtherChecked = false;
        this.Parent.Controls.OfType<ucGraphicLabelRadioButton>().Where(x => x.Checked && x != this).ToList().ForEach(x => {
            x.Checked = false;
            x.lblTitle.GlowColor = Color.Black;
            FoundOtherChecked = true;
        });

        if ((FoundOtherChecked && !this.Checked) || !this.Checked){
            this.Checked = !this.Checked;            
            this.lblTitle.GlowColor = this.rbtnButton.Checked ? Color.Green : Color.Black;
        }

        if (this._CheckedChanged != null)
            this._CheckedChanged(this, new EventArgs());
    }
}

}

“ToggleCheck”事件与RadioButton对象“Click”事件以及标签“Click”事件以及整个自定义控件“Click”事件相关联,因此理想情况下,单击标签上的任何位置都会触发事件。< / p>

当对象被切换时,它会运行linq搜索任何与父控件中相似的对象,并且仅在检查时才抓取它。然后,它取消选中它并将发光状态设置为黑色。

该控件还有一个事件,可以将任何类型的事件转发到单选按钮“CheckedChanged”事件,然后触发它。

我知道做整个

.ToList().ForEach(x => ...)

总是矫枉过正,因为搜索只会返回一个对象(如果它自动关闭,则不会返回),但它确实有效。有更好的方法吗?

编辑:我必须进行一些更改,因为很明显当您直接点击单选按钮时,它会先被检查然后点击的事件会触发。此外,为了确保它们更像收音机按钮,而不像具有单选按钮行为的复选框,I.E。:用户现在无法单击它们。它会检查是否在切换之前切换了一个。