gpt4 book ai didi

c# - 单选按钮CheckedChanged事件仅在选中时?

转载 作者:太空宇宙 更新时间:2023-11-03 19:03:58 24 4
gpt4 key购买 nike

情况

我想在单选按钮被选中时产生一个事件。

我知道选中和取消选中单选按钮时会调用事件 CheckedChanged 事件,我知道原因。我知道如何使用它来仅在检查时执行代码。请参阅:Radio button checked changed event fires twice

问题

然而,我使用其他语言工作,这些语言在单选按钮被选中时有事件(并且在未选中时不被调用)。在C#中有没有直接做这个的事件

(知道是否有针对此的特定事件主要是一个是或否的问题,因为我很清楚我可以检查该事件)

最佳答案

一个通用的变通方法是使用样式为单选按钮的列表框,以防止必须使用多个绑定(bind)/控件/选中时进行检查。只有一个控件需要监视哪个事件 (SelectedIndexChanged),而不是检查哪个单选按钮被选中,而是 SelectedItem。另一个优势是能够绑定(bind)数据源而不是动态添加单选按钮。

为此,这里有一个简单的 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 是自定义绘画的类,可以在任何 ListBox 上使用(绘画也可以集成到控件中, 但一开始这样做是为了给一些现有的列表框一个单选按钮的外观)。

至于显示,通常它还是那种列表框的感觉:

RadioButtonBox

但是通过将背景色设置为“Control”并且没有边框样式,结果看起来像普通的单选按钮:

RadioButtonBox2

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

关于c# - 单选按钮CheckedChanged事件仅在选中时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31430553/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com