C# 单选按钮CheckedChanged事件是否仅在选中时发生?

C# 单选按钮CheckedChanged事件是否仅在选中时发生?,c#,C#,处境 我想在仅选中单选按钮时设置一个事件 我知道当选中和取消选中单选按钮时会调用event CheckedChanged事件,我知道原因。我知道如何使用它只在检查时执行代码。见: 问题: 但是,我使用的其他语言在选中单选按钮时有事件,而在未选中时没有调用事件。是否有这样一个事件直接在C中执行此操作 这主要是一个“是”或“否”的问题,因为我知道我可以在活动中进行检查,但据我所知,这不是一个具体的活动。你最好这样做: var radioButton = sender as RadioButton;

处境

我想在仅选中单选按钮时设置一个事件

我知道当选中和取消选中单选按钮时会调用event CheckedChanged事件,我知道原因。我知道如何使用它只在检查时执行代码。见:

问题:

但是,我使用的其他语言在选中单选按钮时有事件,而在未选中时没有调用事件。是否有这样一个事件直接在C中执行此操作


这主要是一个“是”或“否”的问题,因为我知道我可以在活动中进行检查,但据我所知,这不是一个具体的活动。你最好这样做:

var radioButton = sender as RadioButton;
if (radioButton == null || !radioButton.Checked) return;
// your code ...

据我所知不是这样。你最好这样做:

var radioButton = sender as RadioButton;
if (radioButton == null || !radioButton.Checked) return;
// your code ...

当页面发回时,您可以在页面事件中更改Radiobutton的事件处理程序。
为此,您需要使用VIEWSTATE中的Radiobutton值,然后分配事件处理程序。

当页面发回时,您可以在页面事件中更改Radiobutton的事件处理程序。
为此,您需要使用VIEWSTATE中的Radiobutton值,然后分配事件处理程序。

一个常见的解决方法是使用样式为单选按钮的列表框,以避免必须使用多个绑定/控件/选中复选框。只有一个控件需要监视哪个事件SelectedIndexChanged,而不是检查选中哪个单选按钮,而是SelectedItem。另一个优点是能够绑定数据源,而不是动态添加单选按钮

出于这个目的,这里有一个简单的RadioButtonBox控件,它的功能很早以前就已经实现了,并且从那时起就没有修改过,但现在仍然定期使用它

public class RadioButtonBox:ListBox
{
    public readonly RadioButtonBoxPainter Painter;

    public RadioButtonBox()
    {
        Painter = new RadioButtonBoxPainter(this);
    }

    [DefaultValue(DrawMode.OwnerDrawFixed)]
    public override DrawMode DrawMode
    {
        get{return base.DrawMode;}
        set{base.DrawMode = value;}
    }
}

public class RadioButtonBoxPainter : IDisposable
{

    public readonly ListBox ListBox;
    public RadioButtonBoxPainter(ListBox ListBox)
    {
        this.ListBox = ListBox;
        ListBox.DrawMode = DrawMode.OwnerDrawFixed;
        ListBox.DrawItem += ListBox_DrawItem;
    }

    void ListBox_DrawItem(object sender, DrawItemEventArgs e)
    {
        if (e.Index == -1) return;
        Rectangle r = e.Bounds;
        r.Width = r.Height;
        bool selected = (e.State & DrawItemState.Selected) > 0;
        e.DrawBackground();
        e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
        ControlPaint.DrawRadioButton(e.Graphics, r, selected ? ButtonState.Checked : ButtonState.Normal);
        r.X = r.Right + 2;
        r.Width = e.Bounds.Width - r.X;
        string txt;
        if (ListBox.Site != null && ListBox.Site.DesignMode && e.Index >= ListBox.Items.Count)
            txt = ListBox.Name;
        else
            txt = ListBox.GetItemText(ListBox.Items[e.Index]);
        using (var b = new SolidBrush(e.ForeColor))
            e.Graphics.DrawString(txt, e.Font, b, r);
        if (selected)
        {
            r = e.Bounds;
            r.Width--; r.Height--;
            e.Graphics.DrawRectangle(Pens.DarkBlue, r);
        }
    }

    public void Dispose()
    {
        ListBox.DrawItem -= ListBox_DrawItem;
    }
}
RadioButtonBox是控件,RadioButtonBoxPainter是进行自定义绘制的类,可以在任何列表框上使用。绘制也可以集成到控件中,但在一开始,这是为了给一些现有的列表框一个radiobutton外观

至于显示器,通常它仍会有列表框的感觉:

但通过将backcolor设置为“Control”且无边框样式,结果看起来就像常规单选按钮:


如果总是首选第二种布局,则可以在RadioButtonBox控件中将它们设置为默认值。

一种常见的解决方法是使用样式为单选按钮的列表框,以避免必须使用多个绑定/控件/选中复选框。只有一个控件需要监视哪个事件SelectedIndexChanged,而不是检查选中哪个单选按钮,而是SelectedItem。另一个优点是能够绑定数据源,而不是动态添加单选按钮

出于这个目的,这里有一个简单的RadioButtonBox控件,它的功能很早以前就已经实现了,并且从那时起就没有修改过,但现在仍然定期使用它

public class RadioButtonBox:ListBox
{
    public readonly RadioButtonBoxPainter Painter;

    public RadioButtonBox()
    {
        Painter = new RadioButtonBoxPainter(this);
    }

    [DefaultValue(DrawMode.OwnerDrawFixed)]
    public override DrawMode DrawMode
    {
        get{return base.DrawMode;}
        set{base.DrawMode = value;}
    }
}

public class RadioButtonBoxPainter : IDisposable
{

    public readonly ListBox ListBox;
    public RadioButtonBoxPainter(ListBox ListBox)
    {
        this.ListBox = ListBox;
        ListBox.DrawMode = DrawMode.OwnerDrawFixed;
        ListBox.DrawItem += ListBox_DrawItem;
    }

    void ListBox_DrawItem(object sender, DrawItemEventArgs e)
    {
        if (e.Index == -1) return;
        Rectangle r = e.Bounds;
        r.Width = r.Height;
        bool selected = (e.State & DrawItemState.Selected) > 0;
        e.DrawBackground();
        e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
        ControlPaint.DrawRadioButton(e.Graphics, r, selected ? ButtonState.Checked : ButtonState.Normal);
        r.X = r.Right + 2;
        r.Width = e.Bounds.Width - r.X;
        string txt;
        if (ListBox.Site != null && ListBox.Site.DesignMode && e.Index >= ListBox.Items.Count)
            txt = ListBox.Name;
        else
            txt = ListBox.GetItemText(ListBox.Items[e.Index]);
        using (var b = new SolidBrush(e.ForeColor))
            e.Graphics.DrawString(txt, e.Font, b, r);
        if (selected)
        {
            r = e.Bounds;
            r.Width--; r.Height--;
            e.Graphics.DrawRectangle(Pens.DarkBlue, r);
        }
    }

    public void Dispose()
    {
        ListBox.DrawItem -= ListBox_DrawItem;
    }
}
RadioButtonBox是控件,RadioButtonBoxPainter是进行自定义绘制的类,可以在任何列表框上使用。绘制也可以集成到控件中,但在一开始,这是为了给一些现有的列表框一个radiobutton外观

至于显示器,通常它仍会有列表框的感觉:

但通过将backcolor设置为“Control”且无边框样式,结果看起来就像常规单选按钮:


如果总是首选第二种布局,则可以在RadioButtonBox控件中将其设置为默认值。

否,但为什么不在代码中处理此布局?我的意思是检查按钮是否在CheckedChanged事件中签入?您可能有兴趣在该事件期间检查发件人。我知道我可以在代码中执行此操作,但我只是想确保没有更合适的直接事件,而不是使用在不需要时调用的事件。不知道您是否有兴趣,但为了避免这些情况,我使用了radiobuttonbox,基本上是一个用单选按钮绘制的列表框。这样我只需要听SelectedIndexChanged并获取SelectedItem。最后,这只是另一个解决办法,但它使我不必再次进行同样的检查。如果你想将此作为答案发布,我会标记它。它可以防止不必要的事件调用no,但为什么不在代码中处理呢?我的意思是检查按钮是否在CheckedChanged事件中签入?您可能有兴趣在该事件期间检查发件人。我知道我可以在代码中执行此操作,但我只是想确保没有更合适的直接事件,而不是使用在不需要时调用的事件。不知道您是否有兴趣,但为了避免这些情况,我使用了radiobuttonbox,基本上是一个用单选按钮绘制的列表框。这样我只需要听SelectedIndexChanged并获取SelectedItem。最后,这只是另一个解决办法,但它使我不必再次进行同样的检查。如果你想将此作为答案发布,我会标记它。它可以防止不必要的事件
CallsCreate解决方案,它完全满足条件,只需监视一个控件,只需处理一个事件。另外,如上所述,还可以绑定数据源以提供按钮列表。此外,在设计时只使用一个控件比摆弄多个单选按钮和一个典型的groupbox更容易。这是一个非常好的解决方案,它精确地满足了标准,只需监视一个控件,只需处理一个事件。另外,如上所述,还可以绑定数据源以提供按钮列表。此外,在设计时只使用一个控件比摆弄多个单选按钮(通常是一个分组框)更容易。