2012-11-19 18 views
9

मेरे फॉर्म में सैकड़ों नियंत्रण हैं: मेनू, पैनल, स्प्लिटर, लेबल, टेक्स्ट बॉक्स, आप इसे नाम दें।बटन को छोड़कर फ़ॉर्म पर सभी नियंत्रणों को कैसे अक्षम करें?

क्या एक बटन को छोड़कर हर नियंत्रण को अक्षम करने का कोई तरीका है?

बटन महत्वपूर्ण क्यों है क्योंकि मैं ऐसी विधि का उपयोग नहीं कर सकता जो खिड़की या कुछ को अक्षम करता है क्योंकि एक नियंत्रण को अभी भी उपयोग करने योग्य होना चाहिए।

+1

क्या आप बटन को एक अलग रूप में रखना चाहिए? – SLaks

+0

क्या आप फॉर्म पर सभी नियंत्रणों के माध्यम से लूप नहीं कर सकते हैं, प्रत्येक पर सक्षम संपत्ति सेट कर सकते हैं? अपने लूप में, आईडी/नाम का उपयोग करके बटन को अनदेखा करें। या, आगे बढ़ें और लूप में सबकुछ अक्षम करें, उसके बाद तुरंत बटन सक्षम करें। –

उत्तर

21

आप शामिल सभी नियंत्रणों को अक्षम करने के लिए एक रिकर्सिव कॉल कर सकते हैं। फिर आपको अपने बटन और किसी भी मूल कंटेनर को सक्षम करना होगा।

private void Form1_Load(object sender, EventArgs e) { 
     DisableControls(this); 
     EnableControls(Button1); 
    } 

    private void DisableControls(Control con) { 
     foreach (Control c in con.Controls) { 
      DisableControls(c); 
     } 
     con.Enabled = false; 
    } 

    private void EnableControls(Control con) { 
     if (con != null) { 
      con.Enabled = true; 
      EnableControls(con.Parent); 
     } 
    } 
+1

आप वहां रेफरी कीवर्ड क्यों शामिल करेंगे? –

+0

मैं नहीं करूँगा। मैं इसे लिखते समय फोन पर था और किसी कारण से यह – pinkfloydx33

+0

हा आया। बहुत बढ़िया। मुझे पसंद है कि आपने किसी भी विशिष्ट नियंत्रण के बारे में नहीं जानते या किस तरह की देखभाल की है। न्यूबीज इस तरह की चीज़ों को नजरअंदाज करते हैं। –

8
एक बेहतर, अधिक सुरुचिपूर्ण समाधान है, जो बनाए रखने के लिए आसान होगा के लिए

- आप शायद अपने डिजाइन पर पुनर्विचार करने, अन्य नियंत्रणों से एक तरफ अपने बटन लगाना जैसे की जरूरत है। फिर मानते हैं कि अन्य नियंत्रण पैनल या ग्रुपबॉक्स में हैं, बस Panel.Enabled = False करें।

तुम सच में अपने वर्तमान डिजाइन रखना चाहते हैं, तो आप Linearise ControlCollection tree into array of Control प्रत्यावर्तन से बचने के लिए कर सकते हैं और फिर हों:

Array.ForEach(Me.Controls.GetAllControlsOfType(Of Control), Sub(x As Control) x.Enabled = False) 
yourButton.Enabled = True 
+1

+1 डिज़ाइन पर पुनर्विचार का उल्लेख करने के लिए।'पैनल.एनेबल = झूठी | सच' के लिए –

+0

+1। नियंत्रण के समूह को बनाने के लिए अपने इंटरफ़ेस को फिर से डिज़ाइन करें और फिर पूरे समूह को अक्षम करें निश्चित रूप से UI को डिज़ाइन करने का एक बेहतर तरीका है। – sentenza

10

@ pinkfloydx33 के जवाब और संपादित मैं इस पर किए गए आधार पर, मैं एक विस्तार बनाया सक्षम करें या किसी नियंत्रण, प्रपत्र, मेनू, subcontrols, आदि को निष्क्रिय करने के

public static class GuiExtensionMethods 
{ 
     public static void Enable(this Control con, bool enable) 
     { 
      if (con != null) 
      { 
       foreach (Control c in con.Controls) 
       { 
        c.Enable(enable); 
       } 

       try 
       { 
        con.Invoke((MethodInvoker)(() => con.Enabled = enable)); 
       } 
       catch 
       { 
       } 
      } 
     } 
} 

अब, बस कार्य करें:: विधि यह और भी आसान बना देता है, बस एक public static class इस प्रकार बना

this.Enable(true); //Will enable all the controls and sub controls for this form 
this.Enable(false);//Will disable all the controls and sub controls for this form 

Button1.Enable(true); //Will enable only the Button1 

तो, मैं क्या करना होगा, @ pinkfloydx33 के जवाब के रूप में समान:

private void Form1_Load(object sender, EventArgs e) 
{ 
     this.Enable(false); 
     Button1.Enable(true); 
} 

मैं विस्तार तरीकों की तरह है क्योंकि वे स्थिर हैं और आप उदाहरणों बनाने (स्वयं) के बिना हर जगह इसका इस्तेमाल कर सकते हैं और यह बहुत स्पष्ट है कम से कम मेरे लिए।

+0

यह काम नहीं करता है। यदि आप इसे कॉल करते हैं। सक्षम (झूठा); फिर बटन 1 पर कॉल करें। (सत्य) सक्षम करें, फिर यह (फॉर्म) और बटन 1 के किसी भी अन्य मूल नियंत्रण अभी भी अक्षम हैं। –

+0

शायद मैं आपको समझ में नहीं आता, लेकिन मुझे लगता है कि यह मुद्दा था। यदि आप की आवश्यकता है तो बटन 1 के माता-पिता को सक्षम करने का प्रयास करें, इसे माता-पिता और उसके सभी बच्चों के नियंत्रण को सक्षम करना चाहिए। – coloboxp

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