2011-08-24 13 views
5

वर्तमान में मेरे पास मेरे अधिकांश प्रपत्र नियंत्रण लॉन्च पर अक्षम हैं क्योंकि आप फ़ाइल का लोड होने तक उनका उपयोग नहीं कर सकते हैं। हालांकि, फ़ाइल लोड होने के बाद नियंत्रण सक्षम होना चाहिए।किसी फ़ॉर्म पर सभी नियंत्रण कैसे सक्षम करें?

मैं बाइंडिंग का उपयोग कर रहा था लेकिन मुझे नहीं लगता कि वे एक अच्छे समाधान हैं। एक के लिए, यह अनावश्यक जटिलता है। दूसरा, आप सब कुछ के लिए बाइंडिंग का उपयोग नहीं कर सकते हैं। उदाहरण के लिए, मेनूस्ट्रिप आइटमों में उनकी सक्षम संपत्ति फ़ाइल लोडेड प्रॉपर्टी से बंधी नहीं हो सकती है। केवल पूरा मेनू ही और मैं पूरे मेनू को लॉन्च पर अक्षम नहीं करना चाहता, केवल कुछ मेनू ऑपरेशंस जो फ़ाइल पर काम करते हैं।

मैं वास्तव में सबकुछ सक्षम करने के लिए एक तरीका ढूंढ रहा हूं। अधिकांश यह पूछे जाने पर कि इस के साथ जवाब देने होगा:

foreach (Control c in Controls) 
{ 
    c.Enabled = true; 
} 

हालांकि, कि (एक पैनल या कस्टम नियंत्रण) की तरह अन्य नियंत्रण के भीतर MenuStrip आइटम या नियंत्रण को सक्षम करने के लिए काम नहीं करता। इसलिए यह कंटेनरों के भीतर स्क्रॉलबार सक्षम नहीं करेगा।

मुझे लगता है कि मैं उस लाइन का उपयोग कर सकता हूं और मैन्युअल रूप से अन्य सभी को सक्षम कर सकता हूं लेकिन मैं हमेशा मैन्युअल रूप से सक्षम सब कुछ सक्षम कर सकता था। मैं सब कुछ स्वचालित रूप से सक्षम करने का एक तरीका ढूंढ रहा हूं।

+0

कैसे उन तत्वों पहली जगह में अक्षम किए गए थे? हो सकता है कि आप किसी सूची में अक्षम होने का ट्रैक रख सकें और फिर उस सूची के सभी तत्वों को पुनः सक्षम कर सकें (और इसे साफ़ करें)। –

+0

वे फॉर्म डिजाइनर में अक्षम हैं। अधिकांश एप्लिकेशन के टूल का उपयोग लोड की गई फ़ाइल के बिना नहीं किया जा सकता है, इसलिए वे डिफ़ॉल्ट रूप से अक्षम होते हैं। –

उत्तर

11

Recursion

private void enableControls(Control.ControlCollection Controls) 
{ 
    foreach (Control c in Controls) 
    { 
     c.Enabled = true; 
     if (c is MenuStrip) 
     { 
      foreach(var item in ((MenuStrip)c).Items) 
      { 
       item.Enabled = true; 
      } 
     } 
     if (c.ControlCollection.Count > 0) 
      enableControls(c.Controls); 

    } 
} 

संपादित

नियंत्रण संग्रह HasControls के बजाय गिनती कौन सा है Webcontrols

+0

धन्यवाद, यह अच्छी तरह से काम करता है। हालांकि, यह अभी भी मेनूस्ट्रिप आइटम सक्षम नहीं करता है। मुझे लगता है कि मैं उन्हें मैन्युअल रूप से सक्षम कर सकता हूं लेकिन मुझे आश्चर्य है कि क्या इस लूप के साथ उन्हें शामिल करने का कोई तरीका है? –

+0

हाँ हम यह कर सकते हैं – msarchet

+0

@ जॉन्सस्मिथ मेनस्ट्रिप – msarchet

2

यह करें:

var Enable = (Control c) => 
      { 
       c.Enabled = true; 
       if(c.Controls != null) 
        foreach(Control c2 in c.Controls) 
         Enable(c2); 
      } 

Enable(YourForm); 
+0

यह केवल 1 स्तर – msarchet

+0

@msarchet नीचे चला जाता है: नहीं, यह नहीं है, इसके रिकर्सिव – Dani

+0

कॉल को वापस याद किया और इसे c2.enable – msarchet

1

रिकर्सिवली से अधिक पुनरावृत्ति जाँच किया जाना चाहिए थाआपका मेनू आपके मेनू में प्रत्येक आइटम को अक्षम करने के लिए आवश्यक है। हालांकि, आपके सभी फॉर्म नियंत्रणों के लिए एक आसान समाधान है - उन्हें एक पैनल में एम्बेड करें जो पूरे रूप में फैलता है और वीएस डिजाइनर में फॉर्म को अक्षम करता है। जब आपका उपयोगकर्ता कोई फ़ाइल चुनता है, तो पैनल और व्हायोला सक्षम करें! कोई अतिरिक्त रिकर्सन (या ओवरहेड) आवश्यक नहीं है।

आप अभी भी पुनरावर्ती मार्ग जाना चाहते हैं, मैं, दूसरी पहली ChangeEnabledState को नाम बदलकर उसे विधि को सक्षम और, बदल जाएगा मैं एक एक bool पैरामीटर है कि आप Enabled संपत्ति के लिए आवंटित करने के लिए उपयोग करने की अनुमति होगी होगा। इस तरह आप आवश्यकतानुसार नियंत्रण को सक्षम/अक्षम कर सकते हैं। याद रखें, हालांकि, आपको यह देखने के लिए एक चेक जोड़ने की आवश्यकता होगी कि क्या नियंत्रण बटन है (या ओपनफाइलडियलॉग खोलने के लिए आप जो भी नियंत्रण उपयोग कर रहे हैं) अक्षम ऑपरेशन में छोड़ा गया है।

6

पैनल में सभी नियंत्रण रखें;

पैनल.एनेबल = झूठा -> पैनल में सभी नियंत्रण अक्षम हो जाएंगे पैनल.एनेबल = सत्य -> ​​पैनल में सभी नियंत्रण सक्षम हो जाएंगे (यदि वे डिफ़ॉल्ट रूप से सक्षम हैं, तो जल्द ही सक्षम पैनल के साथ अपने पैनल को भरें , अपने पैनल को अक्षम कर दें ताकि आपके नियंत्रण अक्षम हो जाएंगे। पैनल को सक्षम करने के बाद, आपके नियंत्रण सक्षम हो जाएंगे)

+0

+1, यही वह है जो मैं करता हूं। – TheBlastOne

3

मेनस्ट्रिप आइटमों के लिए आप इसे दोबारा कर सकते हैं, यह बहुत आसान है। बस item.Enabled को सही या गलत पर सेट करें।

आप मेरी कक्षा का उपयोग कर सकते हैं, यह केवल कुछ लाइन कोड है, जो उपयोग में आसान है। आप एक खोज फ़ंक्शन भी बना सकते हैं और बस नाम को अक्षम करना चाहते हैं। आनंद लें:

namespace Test_MenuItemIteration 
{ 
    using System.Collections.Generic; 
    using System.Windows.Forms; 

    public static class GetAllMenuStripItems 
    { 
     #region Methods 

     /// <summary> 
     /// Gets a list of all ToolStripMenuItems 
     /// </summary> 
     /// <param name="menuStrip">The menu strip control</param> 
     /// <returns>List of all ToolStripMenuItems</returns> 
     public static List<ToolStripMenuItem> GetItems(MenuStrip menuStrip) 
     { 
      List<ToolStripMenuItem> myItems = new List<ToolStripMenuItem>(); 
      foreach (ToolStripMenuItem i in menuStrip.Items) 
      { 
       GetMenuItems(i, myItems); 
      } 
      return myItems; 
     } 

     /// <summary> 
     /// Gets the menu items. 
     /// </summary> 
     /// <param name="item">The item.</param> 
     /// <param name="items">The items.</param> 
     private static void GetMenuItems(ToolStripMenuItem item, List<ToolStripMenuItem> items) 
     { 
      items.Add(item); 
      foreach (ToolStripItem i in item.DropDownItems) 
      { 
       if (i is ToolStripMenuItem) 
       { 
        GetMenuItems((ToolStripMenuItem)i, items); 
       } 
      } 
     } 

     #endregion Methods 
    } 
} 

उपयोग करके अपने एप्लिकेशन में:

List<ToolStripMenuItem> myItems = GetAllMenuStripItems.GetItems(this.menuStrip1); 
foreach (var item in myItems) 
{ 
    MessageBox.Show(item.Text); 
    item.Enabled = false; 
} 
संबंधित मुद्दे

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