一个用于整数二进制表示的Winforms控件

3

我可能没有表达清楚(如果是这种情况,请原谅),但是否有人知道一个Winforms控件,可以用于表示二进制形式的整数,并允许用户“切换”每个单独的位?

我使用了CheckListBox控件和一些枚举列表,在设计时为每个位添加了一个复选框,从而拼凑出了一个粗略的解决方案。

这样做虽然可行,但不是一个简洁的解决方案。我想知道是否有更好的方法。我可能需要在其他项目中重复这项工作,所以考虑创建一个自定义控件来完成此任务,但如果有现成的方法可以做到这一点,我会很感兴趣!


1
我不知道是否存在这样的控件;你可能需要自己制作。 - SLaks
1个回答

1
我会尝试这种方法:
创建一个位枚举:
```html

Make bitwise enum:

```
[Flags]
public enum MyBits
{
    MyFirstBit = 1 << 0,
    MySecondBit = 1 << 1,
    MyThirdBit = 1 << 2,
};

现在根据CheckedListBox创建一个自定义控件,该控件接受任何枚举类型作为输入。使用此枚举类型来用复选框填充您的控件。每个枚举类型对应一个复选框。
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;
    }
}

另一个编辑以支持基于其他整数类型(如Int16,UInt32,UInt64等)的枚举。 - Martin Mulder
谢谢@Martin Mulder,这正是我需要的。在我的实验中,我缺少了Enum.GetValues这一部分。目前我无法访问我的开发机器,但我会尝试一下。 - schmichs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接