2010-05-25 11 views
5

Mam 6 przycisków na moim GUI. Widoczność przycisków można skonfigurować za pomocą pól wyboru. Zaznaczenie pola wyboru i zapisanie oznacza, że ​​powinien zostać wyświetlony odpowiedni przycisk. Zastanawiam się, czy jest jakaś możliwość umieszczenia w bazie danych jednej kolumny TinyInt, która reprezentuje widoczność wszystkich 6 przycisków.Użyj TinyInt, aby ukryć/pokazać elementy sterujące?

stworzyłem enum dla przycisków, wygląda na to, że:

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

Teraz zastanawiam się, jak to powiedzieć, że na przykład tylko button1, Button5 i button6 są sprawdzane za pomocą tej jednej kolumny. Możliwe w ogóle?

Dzięki :-)

+0

Dlaczego nie przyjąć odpowiedź Martina? – abatishchev

Odpowiedz

1

Dodaj FlagsAttribute i czerpać z enum bajt:

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

Jeszcze jedno: skąd mam wiedzieć, co to jest 1, a co jest 0 po pobraniu go z bazy danych? -> Znaleźliśmy rozwiązanie ... patrz post Martin Harris :) – grady

6

użyć flagi ENUM zamiast:

[Flags] 
public enum MyButtons 
{ 
    None = 0 
    Button1 = 1, 
    Button2 = 2, 
    Button3 = 4, 
    Button4 = 8, 
    Button5 = 16, 
    Button6 = 32 
} 

Następnie każda kombinacja przycisków jest również unikalna wartość - na przykład Przycisk 1 & Button3 == 5

Ustawiając wartość użyć binarny 'lub' operatora (|):

MyButtons SelectedButtons = MyButtons.Button1 | MyButtons.Button3 

Aby dowiedzieć się, czy przycisk jest zaznaczony użyć binarny 'i' operator (&):

if (SelectedButtons & MyButtons.Button1 == MyButtons.Button1)... 

powodem działa to staje się oczywiste, gdy myślisz binarnych reprezentacji liczb:

MyButtons.Button1 = 000001 
MyButtons.Button3 = 000100 

Kiedy „lub” je razem masz

SelectedButtons = 000001 | 000100 = 000101 

Kiedy „i” że z MyButtons.Button1 - wrócisz do MyButtons.Button1:

IsButton1Selected = 000101 & 000001 = 000001 
+0

Brzmi nieźle, jak mam zrobić oszczędności? Chodzi mi o to, że kolumna to tinyint i jak ustawić wszystkie przyciski przed ich zapisaniem? – grady

+0

MSDN poleca dalej: Użyj Brak jako nazwy stałej wyliczanej przez flagę, której wartość wynosi zero. Http://msdn.microsoft.com/ru-ru/library/system.flagsattribute.aspx – abatishchev

+1

Po ustawieniu wartości SelectedButtons po prostu przekonwertuj go na int i zapisz go w bazie danych. Po przywróceniu go z bazy danych przekonwertuj go z powrotem do wartości wyliczeniowej MyButtons. Istnieją statyczne metody, aby to zrobić w klasie Enum (http://msdn.microsoft.com/en-us/library/system.enum_members.aspx) –

3

Trzeba flagą swoje enum z 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 
} 

więc można użyć:

var mode = MyButtons.Button1 | MyButtons.Button5 | MyButtons.Button6; 

<< oznacza "operator lewostronny" - tylko trochę łatwiejszy sposób ustawiania wartości do wyliczania elementów.

Powiązane problemy