2013-04-28 54 views
3

我可能沒有正確表達這個(並且,如果是這種情況,道歉),但任何人都知道可以用來表示二進制形式的整數的Winforms控件,並允許用戶'切換'每一個單獨的位?對整數的二進制表示形式的Winforms控件

我已經爲此做了一個粗略的方法 - 使用CheckListBox控件和一些枚舉列表,在設計時爲每個位添加一個複選框。

這是有效的,但它不是一個整潔的解決方案,我想知道是否有一個整潔的方法。我可能需要在其他項目中重複這些工作,因此考慮敲定一個自定義控件來做到這一點,但如果任何人知道現有的方法來做到這一點,我會感興趣的!

+1

我不知道有任何這樣的現有控件;你可能需要自己做。 – SLaks 2013-04-28 12:48:41

回答

1

我會嘗試這個辦法:

製作按位枚舉:

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

我編輯添加了ValueChanged事件。 – 2013-04-28 13:21:52

+0

另一種支持基於其他整數類型(如Int16,UInt32,UInt64等)的枚舉的編輯。 – 2013-04-28 13:26:20

+0

感謝@Martin Mulder,那就是票。 'Enum.GetValues'位是我在實驗中缺少的。我目前無法訪問我的開發計算機,但我會隨時歡迎您試用 – schmichs 2013-04-28 15:48:34