c# - 用于整数的二进制表示的 Winforms 控件

标签 c# winforms widget controls bit-manipulation

我可能没有正确表达这一点(如果是这种情况,我深表歉意),但是有没有人知道 Winforms 控件可以用来表示二进制形式的整数,并允许用户“切换”每个单独的位?

我为此拼凑了一个粗略的方法 - 使用 CheckListBox 控件和几个枚举列表,在设计时为每个位添加一个复选框。

这行得通,但这不是一个巧妙的解决方案,我想知道是否有更简洁的方法。我可能需要在其他项目中重复这项工作,所以考虑过敲定一个自定义控件来执行此操作,但如果有人知道执行此操作的现有方法,我会很感兴趣!

最佳答案

我会尝试这种方法:

按位枚举:

[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;
    }
}

关于c# - 用于整数的二进制表示的 Winforms 控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16263023/

相关文章:

.NET Windows 窗体 datagridview - 必须单击组合框列三次才能获得焦点

for-loop - 如何使用 DrawerHeader 和 ListView.builder 构建抽屉

c# - 如何使用反射调用泛型类型内的非泛型方法

vb.net - 防止控制台返回

Android创建小部件以启动其他应用程序但在后台

c++ - 如何在Qt中绘制能够改变颜色的线条?

c# - 如何在c#中设置定时器在特定时间执行

c# - Asp.net Core 1.0 project.json 预发布脚本

c# - 处理签名相同但参数含义不同的函数

c# - 如何比较两个 .NET 对象图的差异?