2010-05-25 22 views
5

Ich habe 6 Tasten auf meiner GUI. Die Sichtbarkeit der Schaltflächen kann über Kontrollkästchen eingestellt werden. Wenn Sie das Kontrollkästchen markieren und speichern, sollte die entsprechende Schaltfläche angezeigt werden. Ich frage mich, ob es irgendwie möglich ist, eine TinyInt Spalte in der Datenbank zu haben, die die Sichtbarkeit aller 6 Knöpfe darstellt.Verwenden Sie TinyInt zum Ausblenden/Anzeigen von Steuerelementen?

ich eine Enumeration für die Schaltflächen erstellt, sieht es wie folgt aus:

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

Nun, wie ich mich, dass zum Beispiel sagen, nur button1, button5 und button6 sind mit dieser eine Spalte überprüft. Möglich überhaupt?

Danke :-)

+0

Warum nicht akzeptieren, Martin Antwort? – abatishchev

Antwort

1

Fügen Sie den Flags und leiten die Enum von 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 
} 
+0

Noch eine Sache: Woher weiß ich, was 1 ist und was 0 ist, nachdem ich es aus der DB abgerufen habe? -> Die Lösung gefunden ... siehe Beitrag von Martin Harris :) – grady

6

Verwenden Enum ein Flaggen statt:

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

Dann kann jede Kombination von Tasten ist auch ein eindeutiger Wert - z.B. Button 1 & Button3 == 5

Wenn der Wert die binären 'oder' Operator-Einstellung (|):

MyButtons SelectedButtons = MyButtons.Button1 | MyButtons.Button3 

Um herauszufinden, ob eine Taste verwenden, um den binären 'und' Operator gewählt ist (&):

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

der Grund dieser Arbeiten offensichtlich wird, wenn Sie die binären Darstellungen der Zahlen denken:

MyButtons.Button1 = 000001 
MyButtons.Button3 = 000100 

Wenn Sie ‚oder‘ sie zusammen erhalten Sie

SelectedButtons = 000001 | 000100 = 000101 

Wenn Sie ‚und‘ dass mit MyButtons.Button1 - Sie MyButtons.Button1 zurück:

IsButton1Selected = 000101 & 000001 = 000001 
+0

Klingt gut, wie mache ich das Speichern? Ich meine, die Spalte ist ein Tinyint und wie setze ich alle Knöpfe bevor ich sie speichere? – grady

+0

MSDN empfiehlt als Nächstes: Verwenden Sie None als den Namen der Flag-Enumerationskonstante, deren Wert Null ist. Http://msdn.microsoft.com/ru-ru/library/system.flagsattribute.aspx – abatishchev

+1

Sobald Sie Ihre SelectedButtons-Wert haben, Konvertiere es einfach in einen int und speichere es in der Datenbank. Wenn Sie es wieder aus der Datenbank holen, konvertieren Sie es zurück in einen MyButtons-Enum-Wert. Es gibt statische Methoden, um dies für die Enum-Klasse zu tun (http://msdn.microsoft.com/en-us/library/system.enum_members.aspx) –

3

Sie auf Flagge haben Ihre enum mit 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 
} 

so können Sie verwenden:

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

<< bedeutet "Links-Shift-Operator" - nur ein bisschen einfacher Weg, um Werte zu enumerieren Elemente.

Verwandte Themen