2008-08-08 10 views
11

क्या मास्टर के लिए ContentPlaceHolder के भीतर लोड किए गए पृष्ठ से मास्टर पेज पर किसी तत्व को एक्सेस करना संभव है?किसी सामग्री पृष्ठ से मास्टर पेज पर .NET तत्व का उपयोग कैसे करें?

मेरे पास एक सूची दृश्य है जो मास्टर पेज पर नेविगेशन क्षेत्र में लोगों के नाम सूचीबद्ध करता है। सूची में एक व्यक्ति को उस तालिका में जोड़ा जाने के बाद मैं सूची दृश्य को अपडेट करना चाहता हूं, जिसमें सूची दृश्य डेटा से जुड़ा हुआ है। ListView वर्तमान में कैश पुनः लोड होने तक इसके मानों को अपडेट नहीं करता है। हमने पाया है कि ListView.DataBind() फिर से चलाना एक सूचीदृश्य की सामग्री अपडेट करेगा। हम मास्टर पेज का उपयोग करने वाले पेज पर ListView.DataBind() चलाने में सक्षम नहीं हैं।

नीचे मैं क्या करना चाहता था का एक नमूना है लेकिन एक संकलक त्रुटि कहते हैं

"PeopleListView वर्तमान संदर्भ में मौजूद नहीं है"

GIS.master - जहां ListView रहता

...<asp:ListView ID="PeopleListView"... 

GISInput_People.aspx - के रूप में यह मास्टर पृष्ठ

है GIS.master का उपयोग करता है

GISInput_People.aspx.cs

AddNewPerson() 
{ 
    // Add person to table 
    .... 

    // Update Person List 
    PeopleListView.DataBind(); 
    ... 
} 

सी # नेट में इस तरह की एक समस्या को हल करने के लिए सबसे अच्छा तरीका क्या हो सकता है?

उत्तर

17

मेरा मानना ​​है कि आप this.Master.FindControl या कुछ इसी तरह का उपयोग करके ऐसा कर सकता है, लेकिन आप शायद नहीं करना चाहिए - यह मास्टर पृष्ठ की संरचना बारे में जानने की बहुत अधिक सामग्री पृष्ठ की आवश्यकता है।

मैं एक अन्य विधि का सुझाव दूंगा, जैसे सामग्री क्षेत्र में एक घटना को फायर करना जो मास्टर सुन सकता है और निकालकर फिर से बांध सकता है।

-1

मान लिया जाये कि आपके मास्टर पृष्ठ MyMaster नामित किया गया था:

(Master as MyMaster).PeopleListView.DataBind(); 

संपादित करें: के बाद से PeopleListView घोषित किया जाएगा डिफ़ॉल्ट रूप से संरक्षित, आप या तो जनता के लिए यह बदलने के लिए, या तो यह है कि एक सार्वजनिक संपत्ति आवरण बनाने की आवश्यकता होगी आप इसे अपने पेज से एक्सेस कर सकते हैं।

4

नियंत्रण मान लिया जाये कि मास्टर पृष्ठ

ListView peopleListView = (ListView)this.Master.FindControl("PeopleListView"); 
peopleListView.DataSource = [whatever]; 
peopleListView.DataBind(); 

"पर PeopleListView" कहा जाता है लेकिन @palmsey अधिक सही है, खासकर यदि आपके पेज एक से अधिक मास्टर पृष्ठ की संभावना हो सकती है। उन्हें कम करें और एक घटना का उपयोग करें।

1

एक को याद रखने के लिए निम्नलिखित एएसपी.NET निर्देश है।

<%@ MasterType attribute="value" [attribute="value"...] %> 

MSDN Reference

यह जब मास्टर पृष्ठ पर एक जोरदार टाइप किया संदर्भ बनाकर this.Master संदर्भित आप में मदद मिलेगी। फिर आप CAST की आवश्यकता के बिना अपने ListView का संदर्भ दे सकते हैं।

0

आप इस कोड के साथ पहुंच सकते हैं। मस्टर।FindControl (ControlID) जो आप चाहते हैं नियंत्रित करते हैं। यह नियंत्रण का संदर्भ देता है, ताकि परिवर्तन प्रभावी हो। एक घटना को फायर करने के बारे में हर स्थिति संभव नहीं हो सकता है।

2

विकल्प 1: आप की तरह

Master.PropMasterTextBox1.Text="SomeString"; 

विकल्प 2 आपके मास्टर पृष्ठ नियंत्रण

public TextBox PropMasterTextBox1 
{ 
    get { return txtMasterBox1; } 
    set { txtMasterBox1 = value; } 
} 

वह सामग्री पृष्ठ पर पहुँच की सार्वजनिक संपत्ति बना सकते हैं: मास्टर पृष्ठ पर:

public string SetMasterTextBox1Text 
{ 
    get { return txtMasterBox1.Text; } 
    set { txtMasterBox1.Text = value; } 
} 
सामग्री पृष्ठ पर

:

Master.SetMasterTextBox1Text="someText"; 

विकल्प 3: आप कुछ सार्वजनिक विधि है कि काम करता है के लिए आप


इन दृष्टिकोण इतना उपयोगी नहीं है बना सकते हैं, लेकिन यह मदद करता है तुम सिर्फ कुछ सीमित और पूर्वनिर्धारित नियंत्रण उपयोग करना चाहते हैं

+0

धन्यवाद, यह काम करता है। हालांकि, आपको इसे कास्ट करने की आवश्यकता है: ((myMasterPage) मास्टर) .SetMasterTextBox1Text = "someText"; –

+0

यह आपके कार्यान्वयन पर निर्भर करता है ... एकल मास्टर पेज के लिए ऐसा करने की आवश्यकता नहीं है। और आपका वास्तविक कार्यान्वयन तब तक जटिल होगा जब इस तरह के मूल उदाहरण (जैसे प्रिंट "हैलो वर्ल्ड!") – BrainCoder

+0

यह वह तरीका है जिसका उपयोग मैंने सर्गुई के अतिरिक्त परिवर्तन के बिना किया था। बिल्कुल वही काम करता है जो मुझे चाहिए था। शायद जवाब के रूप में चिह्नित किया जाना चाहिए था। +1 – James

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