2009-03-30 16 views
11

मेरे पास एक लेबल के साथ मूल उपयोगकर्ता नियंत्रण है। माता-पिता के ऑनइनिट पर, मैं गतिशील रूप से बाल नियंत्रण लोड करता हूं। बाल नियंत्रण से, मुझे माता-पिता के लेबल को कुछ सेट करने की आवश्यकता होगी।बाल नियंत्रण से अभिभावक नियंत्रण तक पहुंच - एएसपी.नेट सी #

अभिभावक संपत्ति का उपयोग तत्काल माता-पिता को लौटाता है जो वास्तव में मेरे मामले में प्लेसहोल्डर है। सैद्धांतिक रूप से, मैं अभिभावक उपयोगकर्ता नियंत्रण के संदर्भ प्राप्त करने के लिए रिकर्सिव लूप कर सकता हूं। क्या मैं यहां सही दिशा में जा रहा हूं? क्या ऐसा करने का एक सीधा तरीका है?

उत्तर

9

बच्चे के NamingContainer प्राप्त करने का प्रयास करें।

+0

इस पद्धति की एक जेनेरिक वर्जन यहां पाया जा सकता ...: http: //www.extensionmethod.net/csharp/control पहुँच माता पिता उपयोगकर्ता नियंत्रण संपत्ति के लिए बच्चे को उपयोगकर्ता नियंत्रण के भीतर से/findparent –

0

एक FindControl विधि है, लेकिन अगर मुझे सही याद है तो यह रिकर्सिव नहीं है। इसके अलावा आपको गारंटी नहीं है कि सभी नियंत्रण पदानुक्रम पृष्ठ_इनिट पर मौजूद हैं, नियंत्रणों तक पहुंचने से पहले til page_load प्रतीक्षा करें। इनिट उन्हें बनाने के लिए है।

0

आप बच्चे को पैरेंट का संदर्भ दे सकते हैं और लेबल सेट करने के लिए अभिभावक पर एक विधि का पर्दाफाश कर सकते हैं, हालांकि यह वस्तुओं को बहुत कसकर जोड़ देगा। अन्यथा आप बच्चे पर एक संपत्ति का पर्दाफाश कर सकते हैं कि माता-पिता तब जांच कर सकते हैं और अपना खुद का लेबल सेट कर सकते हैं।

0

कुछ अलग अलग तरीकों से आप जा सकते हैं अपने बाल वर्ग के लिए एक जनक संपत्ति जोड़ने के लिए ... ... एक की जाएगी और फिर कार्य करें:

// in the context of parent's loading of child: 
child.ParentObject = self; 

मुझे यकीन है कि किसी को वापस आ जाएगा हूँ और यह कुछ सर्वोत्तम अभ्यास या किसी अन्य का उल्लंघन करता है ... लेकिन शग। यदि आप कुछ अलगाव बनाए रखना चाहते हैं तो आप घटनाओं का भी उपयोग कर सकते हैं।

0

यदि आप कोड के माध्यम से उपयोगकर्ता नियंत्रण बनाते हैं, तो कन्स्ट्रक्टर को मजबूती से टाइप किए गए पैरेंट में क्यों न जाएं।

public class MyUserControl1 : UserControl 
{ 
    public void Init(...) 
    { 
    var uc2 = new MyUserControl2(this); 
    } 
} 

public class MyUserControl2 : UserControl 
{ 
    private MyUserControl1 parentUserControl; 

    public MyUserControl2(MyUserControl1 parent) 
    { 
    this.parentUserControl = parent; 
    } 
} 

अब यह कसकर युग्मित है और बाद में आपको समस्याएं पैदा कर सकता है, लेकिन इस परिदृश्य के लिए यह काम कर सकता है।

0

आप सबसे अच्छा शर्त है कि पेज_लोड पूरा होने तक प्रतीक्षा करें और फिर पेजरंटों पर फिर से खोज करें।

यहाँ कुछ विस्तार तरीकों आप accompish में मदद मिलेगी हैं कि:

var control = Page.GetControl(MyControlID);  

public static class ControlExtensions 
    { 
     public static IEnumerable<Control> Flatten(this ControlCollection controls) 
     { 
      List<Control> list = new List<Control>(); 
      controls.Traverse(c => list.Add(c)); 
      return list; 
     } 

     public static IEnumerable<Control> Flatten(this ControlCollection controls, Func<Control, bool> predicate) 
     { 
      List<Control> list = new List<Control>(); 
      controls.Traverse(c => { if (predicate(c)) list.Add(c); }); 
      return list; 
     } 

     public static void Traverse(this ControlCollection controls, Action<Control> action) 
     { 
      foreach (Control control in controls) 
      { 
       action(control); 
       if (control.HasControls()) 
       { 
        control.Controls.Traverse(action); 
       } 
      } 
     } 

     public static Control GetControl(this Control control, string id) 
     { 
      return control.Controls.Flatten(c => c.ID == id).SingleOrDefault(); 
     } 

     public static IEnumerable<Control> GetControls(this Control control) 
     { 
      return control.Controls.Flatten(); 
     } 

     public static IEnumerable<Control> GetControls(this Control control, Func<Control, bool> predicate) 
     { 
      return control.Controls.Flatten(predicate); 
     } 
    } 
4

या आप माता-पिता के माध्यम से पुनरावृति सकता है आप इस तरह के एक विस्तार विधि के साथ के रूप में वांछित नियंत्रण पाते हैं जब तक,।

public static Control GetParentOfType(this Control childControl, 
            Type parentType) 
    { 
     Control parent = childControl.Parent; 
     while(parent.GetType() != parentType) 
     { 
      parent = parent.Parent; 
     } 
     if(parent.GetType() == parentType) 
      return parent; 

    throw new Exception("No control of expected type was found"); 
    } 

अधिक इस विधि यहाँ के बारे में विवरण: http://www.teebot.be/2009/08/extension-method-to-get-controls-parent.html

+2

के लिए अच्छी तरह से काम करता है – Stuart

1
मेरे लिए

यह करने के लिए सही तरीके से नियंत्रण में एक ऐड विधि उजागर कर रहा है। अब यदि आपको इसके बाहर एक लेबल अपडेट करना है, तो किसी ईवेंट को बेनकाब करें, जैसे ऑनकॉलेक्शन चेंज (...) और उस नियंत्रण से संदेह करें जिसे संग्रह के बारे में जानकारी दिखाने की आवश्यकता होगी।

इस तरह प्रत्येक नियंत्रण यह हिस्सा है और सभी रहता है SOLID

1

@Rex एम इस के लिए एक अच्छा और आसान समाधान है और यह सिर्फ इस पर विस्तार करने के लिए उपयोग दिखाने के लिए करता है:

यह कोड स्निपेट प्रयोग किया जाता है

((MyParentUserControlTypeName)NamingContainer).Property1 = "Hello"; 
मुझे
संबंधित मुद्दे