Использовать TinyInt для скрытий/показывания средств управления?

У меня есть 6 кнопок на моем GUI. Видимость кнопок может быть настроена через флажки. Проверка флажка и сохранение означают, что соответствующую кнопку нужно показать. Я задаюсь вопросом, возможно ли так или иначе иметь один столбец TinyInt в базе данных, которая представляет видимость всех 6 кнопок.

Я создал перечисление для кнопок, похоже что:

public enum MyButtons
{
    Button1 = 1,
    Button2 = 2,
    Button3 = 3,
    Button4 = 4,
    Button5 = 5,
    Button6 = 6
}

Теперь я задаюсь вопросом, как сказать, что, например, только button1, button5 и button6 проверяются с помощью этого столбца. Возможный вообще?

Спасибо :-)

5
задан grady 25 May 2010 в 10:22
поделиться

3 ответа

Добавьте атрибут 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
} 
1
ответ дан 13 December 2019 в 22:02
поделиться

Используйте вместо этого 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
6
ответ дан 13 December 2019 в 22:02
поделиться

Вы должны отметить ваше перечисление с помощью 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;

<< означает 'оператор сдвига влево' - просто немного более простой способ установить значения для элементов перечисления.

3
ответ дан 13 December 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: