2010-05-25 9 views
5

मेरे पास मेरे जीयूआई पर 6 बटन हैं। बटन की दृश्यता चेकबॉक्स के माध्यम से कॉन्फ़िगर किया जा सकता है। चेकबॉक्स और बचत की जांच करना मतलब है कि correpsonding बटन दिखाया जाना चाहिए। मैं सोच रहा हूं कि डेटाबेस में एक TinyInt कॉलम होना संभव है या नहीं, जो सभी 6 बटनों की दृश्यता का प्रतिनिधित्व करता है।नियंत्रण छुपाएं/दिखाने के लिए TinyInt का उपयोग करें?

मैं बटन के लिए एक enum बनाया, यह ऐसा दिखता है:

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

अब मैं कैसे कहना है कि उदाहरण के लिए केवल Button1, button5 और button6 इस एक स्तंभ का उपयोग जाँच कर रहे हैं सोच रहा हूँ। बिल्कुल संभव है? :-)

धन्यवाद

+0

क्यों मार्टिन जवाब को स्वीकार नहीं करते? – abatishchev

उत्तर

1

FlagsAttribute जोड़ें, और बाइट से enum निकाले जाते हैं:

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

एक और बात: मुझे कैसे पता चलेगा कि 1 क्या है और डीबी से इसे पुनर्प्राप्त करने के बाद 0 क्या है? -> समाधान मिला ... मार्टिन हैरिस के पोस्ट देखें :) – grady

6

उपयोग एक झंडे के बजाय Enum:

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

तो बटन के किसी भी संयोजन भी एक अनूठा मूल्य है - जैसे बटन 1 & Button3 == 5

सेट करते समय मूल्य द्विआधारी 'या' ऑपरेटर का उपयोग (|):

MyButtons SelectedButtons = MyButtons.Button1 | MyButtons.Button3 

पता लगाने के लिए एक बटन उपयोग द्विआधारी 'और' ऑपरेटर का चयन किया जाता है, तो (&):

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

जब आप संख्या की बाइनरी अभ्यावेदन के बारे में सोच कारण यह काम करता है स्पष्ट हो जाता है:

MyButtons.Button1 = 000001 
MyButtons.Button3 = 000100 

जब आप 'या' उन्हें एक साथ मिल

SelectedButtons = 000001 | 000100 = 000101 

जब आप 'और' कि MyButtons.Button1 साथ - तुम वापस MyButtons.Button1 के लिए मिलता है:

IsButton1Selected = 000101 & 000001 = 000001 
+0

अच्छा लगता है, मैं बचत कैसे कर सकता हूं? मेरा मतलब है, कॉलम एक छोटा सा है और मैं उन्हें बचाने से पहले सभी बटन कैसे सेट करूं? – grady

+0

एमएसडीएन अगली सिफारिश करता है: फ्लैग समेकित स्थिरांक का नाम किसी के रूप में उपयोग नहीं करें जिसका मूल्य शून्य है .. http://msdn.microsoft.com/ru-ru/library/system.flagsattribute.aspx – abatishchev

+1

एक बार जब आपके पास आपके चुने हुए बटन हैं, बस इसे एक int में परिवर्तित करें और इसे डेटाबेस में सहेजें। जब आप इसे वापस डेटाबेस से बाहर लाते हैं तो इसे वापस माइबुटन्स एनम मान में परिवर्तित करें। एनम क्लास (http://msdn.microsoft.com/en-us/library/system.enum_members.aspx) पर ऐसा करने के लिए स्थिर तरीके हैं –

3

आप झंडा करने के लिए है अपने FlagsAttribute साथ enum:

[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; 

<< का मतलब है 'बाएं-शिफ्ट ऑपरेटर' - enum आइटम्स को मान सेट करने के लिए बस थोड़ा और आसान तरीका।

संबंधित मुद्दे