2009-06-29 24 views
6

शुभ दिन हर किसी का उपयोग कर सी # में एक सामग्री नियंत्रण,पहुँच जब मास्टर पेज

मैं ASP.NET में एक पेज का निर्माण कर रहा हूँ, और इस प्रक्रिया में मास्टर पेज का उपयोग कर।

मेरे पास मेरे मास्टर पेज में एक सामग्री प्लेस धारक का नाम "सीएफबीडी" है, जिसमें प्रत्येक पृष्ठ का बॉडी होगा जिसके लिए मास्टर पेज मास्टर पेज है।

एएसपी.नेट वेब पेज में, मेरे पास एक सामग्री टैग (संदर्भ "सीएफबीडी") है जिसमें कुछ नियंत्रण (बटन, इन्फ्राजिस्टिक्स नियंत्रण इत्यादि) भी शामिल हैं, और मैं कोडबहाइंड फ़ाइल में इन नियंत्रणों को एक्सेस करना चाहता हूं। हालांकि, मैं सीधे यह नहीं कर सकता (this.myControl ...), क्योंकि वे सामग्री टैग में घोंसला हैं।

मुझे FindControl विधि के साथ एक समाधान मिला।

ContentPlaceHolder contentPlaceHolder = (ContentPlaceHolder) Master.FindControl("cphBody"); 
ControlType myControl = (ControlType) contentPlaceHolder.FindControl("ControlName"); 

यह ठीक काम करता है। हालांकि, मुझे संदेह है कि यह एक बहुत अच्छा डिजाइन नहीं है। क्या आप लोग ऐसा करने के लिए एक और अधिक सुरुचिपूर्ण तरीका जानते हैं?

धन्यवाद!

गिलाउम गेर्वैस।

+1

आप सामग्री पृष्ठ के codebehind से नियंत्रणों को एक्सेस करने के लिए या पीछे कोशिश कर रहे हैं, मास्टर पृष्ठ के कोड पर किसी पाठ बॉक्स की कि होने के लिए परिवर्तन? – wulimaster

+0

सामग्री पृष्ठ का कोडबहाइंड। –

+0

यह अजीब है। आप अपने कंटेंट पेज के कोड-बैक से सीधे अपने नियंत्रण तक पहुंचने में सक्षम होना चाहिए, जब तक कि वे गतिशील रूप से बनाए और जोड़े जा रहे हों। –

उत्तर

4

रिक Strahl एक अच्छा विवरण (और नमूना कोड) यहां है - http://www.west-wind.com/Weblog/posts/5127.aspx

+0

धन्यवाद! यह मूल रूप से मैंने किया है, इसलिए यह मेरे लिए मेरी विधि को मान्य करता है! –

+0

मैं वास्तव में FindControl को नापसंद करता हूं, आमतौर पर केवल तभी जरूरी होता है जब आप एक मजबूत टाइप की गई संपत्ति का पर्दाफाश नहीं कर सकते हैं और आपको पूर्व-प्रस्तुत आउटपुट के माध्यम से खोदने की आवश्यकता है। – CRice

1

मैं रिकर्सिवली फ़ाइलों को acess के लिए इस कोड का उपयोग:

/// <summary> 
    /// Recursively iterate through the controls collection to find the child controls of the given control 
    /// including controls inside child controls. Return all the IDs of controls of the given type 
    /// </summary> 
    /// <param name="control"></param> 
    /// <param name="controlType"></param> 
    /// <returns></returns> 
    public static List<string> GetChildControlsId(Control control, Type controlType) 
    { 
     List<string> FoundControlsIds = new List<string>(); 
     GetChildControlsIdRecursive(FoundControlsIds, control, controlType); 

     // return the result as a generic list of Controls 
     return FoundControlsIds; 
    } 

    public static List<string> GetChildControlsIdRecursive(List<string> foundControlsIds, Control control, Type controlType) 
    { 
     foreach (Control c in control.Controls) 
     { 
      if (controlType == null || controlType.IsAssignableFrom(c.GetType())) 
      { 
       // check if the control is already in the collection 
       String FoundControl = foundControlsIds.Find(delegate(string ctrlId) { return ctrlId == c.ID; }); 

       if (String.IsNullOrEmpty(FoundControl)) 
       { 
        // add this control and all its nested controls 
        foundControlsIds.Add(c.ID); 
       } 
      } 

      if (c.HasControls()) 
      { 
       GetChildControlsIdRecursive(foundControlsIds, c, controlType); 
      } 
     } 
7

मैं कोशिश करते हैं और FindControl से बचने जब तक कि वहाँ कोई विकल्प नहीं है, और आमतौर पर एक साफ रास्ता है।

कैसे जो तुम सीधे पीछे आपके मास्टर पृष्ठ कोड से कोड कॉल करने के लिए अनुमति देगा अपने बच्चे पेज

<%@ MasterType VirtualPath="~/MasterPages/PublicUI.Master" %> 

के शीर्ष पर अपने मास्टर पृष्ठ के लिए पथ सहित के बारे में।

फिर अपने गुरु पेज कोड से पीछे आप एक संपत्ति अपने नियंत्रण वापसी कर सकता है, या मास्टर पृष्ठ पर एक विधि बनाने के अपने नियंत्रण पाने आदि

public Label SomethingLabel 
{ 
    get { return lblSomething; } 
} 
//or 
public string SomethingText 
{ 
    get { return lblSomething.Text; } 
    set { lblSomething.Text = value; } 
} 

मास्टर पृष्ठ पर एक लेबल को संदर्भित करता है

<asp:Label ID="lblSomething" runat="server" /> 

उपयोग:

Master.SomethingLabel.Text = "some text"; 
//or 
Master.SomethingText = "some text"; 
+0

आसपास के दूसरे तरीके के बारे में क्या? मेरे पास मेरे सामग्री पृष्ठ में 'ग्रिड व्यू' है और मैं इसे अपने मास्टरपेज से अपडेट करने में सक्षम होना चाहता हूं। – Si8

+0

मैं मास्टर पेज से आपको आवश्यक ईवेंट डेटा के साथ एक ईवेंट उठाऊंगा और अपने पृष्ठ के साथ इसकी सदस्यता लेगा। मास्टर। SomEvent + = कुछ हैंडलर; – CRice

3

कुछ भी नहीं अलग करना। मास्टर पेज लेबल नियंत्रण तक पहुंचने के लिए बस इस कोड को बाल पृष्ठ पर लिखें।

Label lblMessage = new Label(); 
lblMessage = (Label)Master.FindControl("lblTest"); 
lblMessage.Text = DropDownList1.SelectedItem.Text; 
1

हाय बस मैं अपने समाधान का हिस्सा था सोचा, पाया यह एक 'नियंत्रण' एक < एएसपी के अंदर है कि तक पहुँचने के लिए काम करता है: कक्ष> जिसकी वजह से 'ContentPage' पर है, लेकिन के सी # कोड-पीछे से 'मास्टरपेज'। उम्मीद है कि यह कुछ मदद करता है। एक आईडी = "PanelWithLabel" और runat = "सर्वर" अपने ContentPage के साथ कक्ष>:

  1. एक < एएसपी जोड़ें।

  2. पैनल के अंदर, < एएसपी जोड़ें: आईडी> "MyLabel" के साथ लेबल> नियंत्रण जोड़ें।

  3. अपने मास्टरपेज कोड-फ़ंक्शन में एक फ़ंक्शन लिखें (या नीचे कॉपी/पेस्ट करें): (यह पैनल पेज के अंदर लेबल नियंत्रण का उपयोग करता है, जो कि सामग्री पृष्ठ पर हैं, मास्टर पेज कोड से पीछे और इसके पाठ्य मास्टर पेज :)

    protected void onButton1_click(object sender, EventArgs e) 
    { 
    // find a Panel on Content Page and access its controls (Labels, TextBoxes, etc.) from my master page code behind // 
    System.Web.UI.WebControls.Panel pnl1; 
    pnl1 = (System.Web.UI.WebControls.Panel)MainContent.FindControl("PanelWithLabel"); 
    if (pnl1 != null) 
    { 
        System.Web.UI.WebControls.Label lbl = (System.Web.UI.WebControls.Label)pnl1.FindControl("MyLabel"); 
        lbl.Text = MyMasterPageTextBox.Text; 
    } 
    } 
    
संबंधित मुद्दे