У меня есть 6 кнопок на моем GUI. Видимость кнопок может быть настроена через флажки. Проверка флажка и сохранение означают, что соответствующую кнопку нужно показать. Я задаюсь вопросом, возможно ли так или иначе иметь один столбец TinyInt в базе данных, которая представляет видимость всех 6 кнопок.
Я создал перечисление для кнопок, похоже что:
public enum MyButtons
{
Button1 = 1,
Button2 = 2,
Button3 = 3,
Button4 = 4,
Button5 = 5,
Button6 = 6
}
Теперь я задаюсь вопросом, как сказать, что, например, только button1, button5 и button6 проверяются с помощью этого столбца. Возможный вообще?
Спасибо :-)
Добавьте атрибут 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
}
Используйте вместо этого enum флагов:
[Flags]
public enum MyButtons
{
None = 0
Button1 = 1,
Button2 = 2,
Button3 = 4,
Button4 = 8,
Button5 = 16,
Button6 = 32
}
Тогда любая комбинация кнопок также является уникальным значением - например, Button 1 & Button3 == 5
При установке значения используйте двоичный оператор 'or' (|):
MyButtons SelectedButtons = MyButtons.Button1 | MyButtons.Button3
Чтобы узнать, выбрана ли кнопка, используйте двоичный оператор 'and' (&):
if (SelectedButtons & MyButtons.Button1 == MyButtons.Button1)...
Причина, по которой это работает, становится очевидной, когда вы думаете о двоичных представлениях чисел:
MyButtons.Button1 = 000001
MyButtons.Button3 = 000100
Когда вы 'или' их вместе, вы получаете
SelectedButtons = 000001 | 000100 = 000101
Когда вы 'и' это с MyButtons.Button1 - вы возвращаетесь к MyButtons.Button1:
IsButton1Selected = 000101 & 000001 = 000001
Вы должны отметить ваше перечисление с помощью 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;
<<
означает 'оператор сдвига влево' - просто немного более простой способ установить значения для элементов перечисления.