gpt4 book ai didi

c# - Windows 窗体 RadioButton 列表 - 将枚举属性绑定(bind)到 RadioButton

转载 作者:行者123 更新时间:2023-11-30 15:59:41 27 4
gpt4 key购买 nike

假设我有几个单选按钮和一些自定义对象作为数据源。

举个例子

public enum SomeModeType
{
firstMode = 10,
secondMode = 20,
thirdMode = 30
}

public class MyCustomObject:INotifyPropertyChanged
{

private SomeModeType _mode;
public SomeModeType Mode
{
set { _mode = value; }
get { return _mode; }
}

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}

如何将此对象属性(如果可能)绑定(bind)到 3 个不同的单选按钮,例如:

如果选中 radiobuttonOne - 对象属性 mode 设置为 firstMode

如果选中 radiobuttonTwo - 对象属性 mode 设置为 secondMode

如果选中 radiobuttonThree - 对象属性 mode 设置为 thirdMode

等等等等

还是为此使用事件更好?

附言我知道如何使用事件,但它不知所措地逐个事件创建事件,例如 rb1chnagedrb2changed、...、rb100changed,不是吗?

附言

圣诞快乐!

最佳答案

对于枚举的每个值,您需要创建一个 RadioButton并绑定(bind)其 CheckedMode数据源的属性。然后你需要使用 FormatParse Binding的事件转换 Mode值到适合 Checked 的值属性(property),反之亦然。

示例 - 使用 FlowLayoutPanel 的单选按钮列表

例如放一个FlowLayoutPanel控制您的表单,然后在 LoadForm的事件编写以下代码。代码将添加 RadioButton动态控制流布局面板并执行数据绑定(bind):

var enumValues = Enum.GetValues(typeof(SomeModeType)).Cast<object>()
.Select(x => new { Value = x, Name = x.ToString() }).ToList();
enumValues.ForEach(x =>
{
var radio = new RadioButton() { Text = x.Name, Tag = x.Value };
var binding = radio.DataBindings.Add("Checked", dataSource,
"Mode", true, DataSourceUpdateMode.OnPropertyChanged);
binding.Format += (obj, ea) =>
{ ea.Value = ((Binding)obj).Control.Tag.Equals(ea.Value); };
binding.Parse += (obj, ea) =>
{ if ((bool)ea.Value == true) ea.Value = ((Binding)obj).Control.Tag; };
flowLayoutPanel1.Controls.Add(radio);
});

在上面的例子中,dataSource可以是 MyCustomObjectBindingList<MyCustomObject>BindingSource其中包含 List<MyCustomObject>在其 DataSource .

另一种选择 - 使用所有者绘制列表框的单选按钮列表

作为另一种选择,您可以使用所有者绘制 ListBox并渲染 RadioButton对于项目。这样,您可以绑定(bind) SelectedValueListBoxMode你的对象的属性。 dataSourcs在下面的代码中可以像上面的例子一样。放一个ListBox在表单上并在 Load 中编写以下代码形式事件:

var enumValues = Enum.GetValues(typeof(SomeModeType)).Cast<object>()
.Select(x => new { Value = x, Name = x.ToString() }).ToList();
this.listBox1.DataSource = enumValues;
this.listBox1.ValueMember = "Value";
this.listBox1.DisplayMember = "Name";
this.listBox1.DataBindings.Add("SelectedValue", dataSource,
"Mode", true, DataSourceUpdateMode.OnPropertyChanged);
this.listBox1.DrawMode = DrawMode.OwnerDrawFixed;
this.listBox1.ItemHeight = RadioButtonRenderer.GetGlyphSize(
Graphics.FromHwnd(IntPtr.Zero),
RadioButtonState.CheckedNormal).Height + 4;
this.listBox1.DrawItem += (obj, ea) =>
{
var lb = (ListBox)obj;
ea.DrawBackground();
var text = lb.GetItemText(lb.Items[ea.Index]);
var r = ea.Bounds;
r.Offset(ea.Bounds.Height, 0);
RadioButtonRenderer.DrawRadioButton(ea.Graphics,
new Point(ea.Bounds.Location.X, ea.Bounds.Location.Y + 2), r, text,
lb.Font, TextFormatFlags.Left, false,
(ea.State & DrawItemState.Selected) == DrawItemState.Selected ?
RadioButtonState.CheckedNormal : RadioButtonState.UncheckedNormal);
};

截图

您可以在下图中看到这两种解决方案:

enter image description here

var list = new List<MyCustomObject>() { 
new MyCustomObject(){ Mode= SomeModeType.firstMode},
new MyCustomObject(){ Mode= SomeModeType.secondMode},
new MyCustomObject(){ Mode= SomeModeType.thirdMode},
};
this.myCustomObjectBindingSource.DataSource = list;
var dataSource = myCustomObjectBindingSource;

注意

回答完这个问题后,我创建并分享了一个RadioButtonList控制在这个帖子里:WinForms RadioButtonList doesn't exist .

它有数据绑定(bind)支持,你可以像ListBox一样使用这个控件。 .为此,只需将其绑定(bind)到模型的属性,然后以这种方式简单地设置控件的数据源:

radioButtonList1.DataSource = Enum.GetValues(typeof(YourEnumType)); 

关于c# - Windows 窗体 RadioButton 列表 - 将枚举属性绑定(bind)到 RadioButton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41329354/

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