C# 用于整数二进制表示的Winforms控件
我可能没有正确地阐明这一点(如果是这样的话,我深表歉意),但是有人知道Winforms控件可以用于以二进制形式表示整数,并允许用户“切换”每个单独的位吗 我已经拼凑了一个粗略的方法——使用一个C# 用于整数二进制表示的Winforms控件,c#,winforms,widget,controls,bit-manipulation,C#,Winforms,Widget,Controls,Bit Manipulation,我可能没有正确地阐明这一点(如果是这样的话,我深表歉意),但是有人知道Winforms控件可以用于以二进制形式表示整数,并允许用户“切换”每个单独的位吗 我已经拼凑了一个粗略的方法——使用一个CheckListBox控件和两个枚举列表,在设计时为每个位添加一个复选框 这是可行的,但这不是一个整洁的解决方案,我想知道是否有更整洁的方法。我可能需要在其他项目中重复这项工作,因此考虑使用自定义控件来完成这项工作,但是如果有人知道现有的方法来完成这项工作,我会感兴趣的 我会尝试这种方法: 生成按位枚举:
CheckListBox
控件和两个枚举列表,在设计时为每个位添加一个复选框
这是可行的,但这不是一个整洁的解决方案,我想知道是否有更整洁的方法。我可能需要在其他项目中重复这项工作,因此考虑使用自定义控件来完成这项工作,但是如果有人知道现有的方法来完成这项工作,我会感兴趣的 我会尝试这种方法: 生成按位枚举:
[Flags]
public enum MyBits
{
MyFirstBit = 1 << 0,
MySecondBit = 1 << 1,
MyThirdBit = 1 << 2,
};
[标志]
公共枚举MyBits
{
MyFirstBit=1我不知道任何这样的现有控件;您可能需要自己创建。另一个编辑以支持基于其他整数类型(如Int16、UInt32、UInt64等)的枚举。感谢@Martin Mulder,这就是问题所在。Enum.GetValues
位是我在实验中缺少的。我没有访问我的开发工具的权限我现在不想买机器,但我会试试看
public partial class EnumEditor : CheckedListBox
{
public EnumEditor()
{
InitializeComponent();
ItemCheck += EnumEditor_ItemCheck;
}
private object _value;
public object Value
{
get
{
return _value;
}
set
{
if (value == null)
throw new ArgumentNullException("Value");
if (!value.GetType().IsEnum)
throw new ArgumentNullException("Value should be enumerable.");
if (value.GetType().GetCustomAttributes(typeof(FlagsAttribute), false).Length == 0)
throw new ArgumentNullException("Value must be marked with [Flags].");
_value = value;
Rebuild();
}
}
public event EventHandler<EnumValueChangeEventArgs> ValueChanged;
protected virtual void OnValueChanged(object value)
{
EventHandler<EnumValueChangeEventArgs> valueChanged = ValueChanged;
if (valueChanged != null)
valueChanged(this, new EnumValueChangeEventArgs { Value = value });
}
private void Rebuild()
{
Items.Clear();
if (_value != null)
{
foreach (object value in Enum.GetValues(_value.GetType()))
Items.Add(value, ((int)_value & (int)value) != 0);
}
}
void EnumEditor_ItemCheck(object sender, ItemCheckEventArgs e)
{
ulong bits = Convert.ToUInt64(_value);
ulong bit = Convert.ToUInt64(Items[e.Index]);
if (e.NewValue == CheckState.Checked)
bits = bits | bit;
else
bits = bits & ~bit;
_value = Enum.ToObject(_value.GetType(), bits);
OnValueChanged(_value);
}
}
public class EnumValueChangeEventArgs : EventArgs
{
public object Value
{
get;
set;
}
}