5

मेनू विंडोविंडोज़ फॉर्म में सभी पैनलों को कैसे छिपाना है?

मैन्युअल रूप से नामों को मैन्युअल रूप से पास करके सभी पैनलों को छुपाकर एक पैनल प्रदर्शित होता है, क्या सभी पैनलों को छिपाने का कोई तरीका है या किसी भी तरह से एक रूप में सभी पैनलों के नाम पाने के लिए ??

+0

मैं अपने शीर्षक संपादित किया है। कृपया देखें, "[प्रश्नों में उनके शीर्षक में" टैग "शामिल होना चाहिए?] (Http://meta.stackexchange.com/questions/19190/)", जहां आम सहमति है "नहीं, उन्हें नहीं करना चाहिए"। –

+0

क्या आपने एक [foreach] (http://msdn.microsoft.com/en-us/library/ttw7t8t6 (v = vs.80) .aspx) लूप का उपयोग करने में देखा है? – Brian

उत्तर

8
foreach (Control c in this.Controls) 
{ 
    if (c is Panel) c.Visible = false; 
} 

और तुम भी बजाय this.Controls का उपयोग करने का है कि पुनरावर्ती कर सकता है, और ControlCollection में पारित:

HidePanels(this.Controls); 

... 

private void HidePanels(ControlCollection controls) 
{ 
    foreach (Control c in controls) 
    { 
     if (c is Panel) 
     { 
      c.Visible = false; 
     } 

     // hide any panels this control may have 
     HidePanels(c.Controls); 
    } 
} 
+0

निंजा'ड। मैं अभी उस कोड को लिख रहा था। तो अब आप मेरा अपवित्र है। – Renan

+0

@ रेनान, बहुत दोस्त धन्यवाद! –

+0

+1 मुझे पंच पर मारने के लिए +1: पी – Brian

3

इसका यह

foreach (Panel p in this.Controls.OfType<Panel>()) { 
    p.Visible = false; 
} 
1

अरे तरह कुछ लिखने के लिए स्वच्छ! मैं बस कोड भी लिख रहा था! : पी

Control[] aryControls = new Control[]{ controlnamehere1, controlnamehere2 }; 
foreach (Control ctrl in aryControls) 
{ 
    ctrl.Hide(); 
} 

या, वैकल्पिक रूप से:

Control[] aryControls = new Control[]{ controlnamehere1, controlnamehere1 }; 
foreach (Control ctrl in aryControls) 
{ 
    ctrl.Visible = false; 
} 
+0

आप कैसे जानते हैं कि नियंत्रण में पैनल 1, बटन 1 है? आप नई नियंत्रण [] सरणी क्यों बना रहे हैं, इसकी याददाश्त अप्रभावी है, क्या आप बुरी आदतों को सीखने की कोशिश कर रहे हैं - अनावश्यक रूप से स्मृति को बर्बाद करने के लिए? –

+0

अधिक स्पष्ट होने के लिए संपादित किया गया। क्या आप अभी मेरे स्नैकी होने के जवाब देख रहे हैं? – Brian

5

तो शायद आप प्रपत्र पर कहीं भी नियंत्रण के सभी प्राप्त करना चाहते हैं, न सिर्फ शीर्ष स्तर नियंत्रित करता है। ऐसी स्थिति में हमने इस आसान थोड़ा सहायक समारोह सभी चाइल्ड नियंत्रण प्राप्त करने के लिए सभी स्तरों पर, एक विशेष नियंत्रण के लिए की आवश्यकता होगी:

public static IEnumerable<Control> GetAllControls(Control control) 
{ 
    Stack<Control> stack = new Stack<Control>(); 
    stack.Push(control); 

    while (stack.Any()) 
    { 
     var next = stack.Pop(); 
     yield return next; 
     foreach (Control child in next.Controls) 
     { 
      stack.Push(child); 
     } 
    } 
} 

(यह एक विस्तार विधि बनाने के लिए स्वतंत्र महसूस अगर आपको लगता है आप इसका उपयोग पर्याप्त)

फिर हम सिर्फ OfType कि परिणाम पर एक विशेष प्रकार का नियंत्रण प्राप्त करने के लिए उपयोग कर सकते हैं:।

var panels = GetAllControls(this).OfType<Panel>(); 
+0

रिकर्सन के बजाए लूप का उपयोग करने का अच्छा तरीका (जिससे संभावित स्टैक ओवरफ़्लो से परहेज किया जाता है, यद्यपि यदि आप उस नियंत्रण पदानुक्रम के गहरे होने में कामयाब रहे हैं, तो आपको शायद पीछे हटना चाहिए और सांस लेना चाहिए ...)! मुझे लगता है कि यह थोड़ा सा बेहतर हो सकता है यदि आपने सामान्य प्रकार के रूप में लिया और केवल उन नियंत्रणों को धक्का दिया जो अनुरोधित प्रकार से स्टैक पर मेल खाते थे। शायद इसकी आवश्यकता नहीं है, एचआरएम .... – Joshua

+0

@ जोशुआ यह काम नहीं करेगा। यदि पैनल में शीर्ष स्तर पर उपयोगकर्ता नियंत्रण होता है तो क्या होगा। क्या आप उस पैनल को चाहते हैं या नहीं? यदि आप करते हैं, तो आप उन पैनलों को फ़िल्टर नहीं कर सकते जिन्हें आप तुरंत ढूंढ रहे हैं, आपको अंत में इसे करने की आवश्यकता है।बेशक अगर आप नियंत्रण वापस नहीं करना चाहते हैं, तब तक, और उसके सभी माता-पिता निर्दिष्ट प्रकार के * सभी * हैं, तो यह एक अलग कहानी है। यह निश्चित रूप से तेज़ होगा (आप बहुत कम नियंत्रण देखते हैं), लेकिन यह परिणामों के संदर्भ में भी बहुत अलग है। – Servy

+0

@ जोशुआ यह भी ध्यान दें कि रिकर्सन से परहेज न केवल किसी भी संभावित एसओ अपवादों को रोकता है, यह आमतौर पर अधिक प्रदर्शन करने वाला भी होता है। एक * विशाल * मार्जिन से नहीं, बल्कि एक डिग्री के लिए। अपवादों को डीबग करने या उससे निपटने पर यह गन्दा स्टैक निशान भी रोकता है। – Servy

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