我的GUI上有6个按钮。可以通过复选框配置按钮的可见性。选中复选框并保存意味着应显示相应按钮。我想知道是否有可能在数据库中有一个TinyInt列表示所有6个按钮的可见性。
我为按钮创建了一个枚举,它看起来像是:
public enum MyButtons
{
Button1 = 1,
Button2 = 2,
Button3 = 3,
Button4 = 4,
Button5 = 5,
Button6 = 6
}
现在我想知道怎么说,例如只使用这一列检查button1,button5和button6。可能吗?
谢谢: - )
答案 0 :(得分:6)
改为使用标志枚举:
[Flags]
public enum MyButtons
{
None = 0
Button1 = 1,
Button2 = 2,
Button3 = 4,
Button4 = 8,
Button5 = 16,
Button6 = 32
}
然后任何按钮组合也是一个独特的值 - 例如按钮1& Button3 == 5
设置值时,请使用二进制'或'运算符(|):
MyButtons SelectedButtons = MyButtons.Button1 | MyButtons.Button3
要确定是否选择了按钮,请使用二进制'和'运算符(&):
if (SelectedButtons & MyButtons.Button1 == MyButtons.Button1)...
当你想到数字的二进制表示时,这个工作的原因变得很明显:
MyButtons.Button1 = 000001
MyButtons.Button3 = 000100
当你'或'他们在一起时,你得到
SelectedButtons = 000001 | 000100 = 000101
当你'和'与MyButtons.Button1 - 你回到MyButtons.Button1:
IsButton1Selected = 000101 & 000001 = 000001
答案 1 :(得分:3)
您必须使用FlagsAttribute
标记您的枚举:
[Flags]
public enum MyButtons : byte
{
None = 0
Button1 = 1,
Button2 = 1 << 1,
Button3 = 1 << 2,
Button4 = 1 << 3,
Button5 = 1 << 4,
Button6 = 1 << 5
}
所以你可以使用:
var mode = MyButtons.Button1 | MyButtons.Button5 | MyButtons.Button6;
<<
表示“左移操作符” - 只是为枚举项设置值的更简单方法。
答案 2 :(得分:1)
添加FlagsAttribute,并从byte:
派生枚举class Program {
static void Main(string[] args) {
MyButtons buttonsVisible = MyButtons.Button1 | MyButtons.Button2;
buttonsVisible |= MyButtons.Button8;
byte buttonByte = (byte)buttonsVisible; // store this into database
buttonsVisible = (MyButtons)buttonByte; // retreive from database
}
}
[Flags]
public enum MyButtons : byte {
Button1 = 1,
Button2 = 1 << 1,
Button3 = 1 << 2,
Button4 = 1 << 3,
Button5 = 1 << 4,
Button6 = 1 << 5,
Button7 = 1 << 6,
Button8 = 1 << 7
}