使用TinyInt隐藏/显示控件?

gra*_*ady 5 c# enums visibility tinyint

我的GUI上有6个按钮.可以通过复选框配置按钮的可见性.选中复选框并保存意味着应显示相应按钮.我想知道是否有可能在数据库中有一个TinyInt列表示所有6个按钮的可见性.

我为按钮创建了一个枚举,看起来像这样:

public enum MyButtons
{
    Button1 = 1,
    Button2 = 2,
    Button3 = 3,
    Button4 = 4,
    Button5 = 5,
    Button6 = 6
}
Run Code Online (Sandbox Code Playgroud)

现在我想知道怎么说,例如只使用这一列检查button1,button5和button6.可能吗?

谢谢 :-)

Mar*_*ris 6

请使用标志枚举:

[Flags]
public enum MyButtons
{
    None = 0
    Button1 = 1,
    Button2 = 2,
    Button3 = 4,
    Button4 = 8,
    Button5 = 16,
    Button6 = 32
}
Run Code Online (Sandbox Code Playgroud)

然后任何按钮组合也是一个唯一值 - 例如按钮1和按钮3 == 5

设置值时使用二进制'或'运算符(|):

MyButtons SelectedButtons = MyButtons.Button1 | MyButtons.Button3
Run Code Online (Sandbox Code Playgroud)

要确定是否选择了按钮,请使用二进制'和'运算符(&):

if (SelectedButtons & MyButtons.Button1 == MyButtons.Button1)... 
Run Code Online (Sandbox Code Playgroud)

当你想到数字的二进制表示时,这个工作的原因变得很明显:

MyButtons.Button1 = 000001
MyButtons.Button3 = 000100
Run Code Online (Sandbox Code Playgroud)

当你'或'他们在一起你得到

SelectedButtons = 000001 | 000100 = 000101
Run Code Online (Sandbox Code Playgroud)

当你'和'与MyButtons.Button1 - 你回到MyButtons.Button1:

IsButton1Selected = 000101 & 000001 = 000001
Run Code Online (Sandbox Code Playgroud)

  • 还要考虑tinyint的最大值为255(8位),因此如果您有超过8个按钮,则需要更大的列类型. (2认同)

Fre*_*son 1

添加 FlagsAttribute,并从字节派生枚举:

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
} 
Run Code Online (Sandbox Code Playgroud)