2010-05-25 19 views
5

Tengo 6 botones en mi GUI. La visibilidad de los botones se puede configurar a través de casillas de verificación. Al marcar la casilla de verificación y guardar significa que se debe mostrar el botón correspondiente. Me pregunto si de alguna manera es posible tener una columna TinyInt en la base de datos que represente la visibilidad de los 6 botones.Use TinyInt para ocultar/mostrar los controles?

creé una enumeración de los botones, se ve así:

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

Ahora me pregunto cómo decir que por ejemplo, sólo el botón 1, button5 y button6 se comprueban mediante ésta columna. Posible en absoluto?

Gracias :-)

+0

Por qué no aceptan la respuesta de Martin? – abatishchev

Respuesta

1

Añadir la FlagsAttribute, y derivan la enumeración de bytes:

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

Una cosa más: ¿cómo sé qué es 1 y qué es 0 después de recuperarlo de la base de datos? -> Encontré la solución ... ver la publicación de Martin Harris :) – grady

6

Usar un Banderas ENUM lugar:

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

Entonces, cualquier combinación de botones es también un valor único - por ejemplo, Botón 1 & Button3 == 5

Al ajustar el valor de uso de la 'o' operador binario (|):

MyButtons SelectedButtons = MyButtons.Button1 | MyButtons.Button3 

Para saber si un botón se selecciona el uso 'y' operador binario (&):

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

La razón por la que esto funciona se hace evidente cuando se piensa en las representaciones binarias de los números:

MyButtons.Button1 = 000001 
MyButtons.Button3 = 000100 

Cuando 'o' juntos se obtiene

SelectedButtons = 000001 | 000100 = 000101 

Cuando 'y' que, con MyButtons.Button1 - que volver a MyButtons.Button1:

IsButton1Selected = 000101 & 000001 = 000001 
+0

Suena bien, ¿cómo hago el ahorro? Quiero decir, la columna es una letra minúscula y ¿cómo configuro todos los botones antes de guardarlos? – grady

+0

MSDN recomienda a continuación: Use None como el nombre de la constante enumerada de indicador cuyo valor es cero. Http://msdn.microsoft.com/ru-ru/library/system.flagsattribute.aspx – abatishchev

+1

Una vez que tenga el valor SelectedButtons, simplemente conviértalo en un int y guárdalo en la base de datos. Cuando lo recuperas de la base de datos, vuelve a convertirlo en un valor enum de MyButtons. Hay métodos estáticos para hacer esto en la clase Enum (http://msdn.microsoft.com/en-us/library/system.enum_members.aspx) –

3

Tienes que su bandera enumeración con 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 
} 

esta manera puede utilizar:

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

<< significa 'operador de desplazamiento a la izquierda' - una forma un poco más fácil de establecer valores para los artículos enum.

Cuestiones relacionadas