2011-11-16 17 views
19

के भीतर सभी नियंत्रण शून्य हैं मेरे पास एक UserControl है जो अन्य नियंत्रणों के साथ UserControl का उपयोग करता है।उपयोगकर्ता नियंत्रण

ascx फ़ाइल मैं निम्नलिखित कोड है में:

<%@ Register TagPrefix="tag" Namespace="some.name.space" Assembly="some.assembly" %> 
<tag:control ID="test" runat="server" /> 

मेरी Page_Load विधि में, मैं बहुत तरह परीक्षण पर एक संपत्ति सेट करने का प्रयास:

test.Text = "Hello World!"; 

यह वास्तव में पाठ संपत्ति सेट मेरे उपयोगकर्ता नियंत्रण में एक शाब्दिक नियंत्रण का test

वस्तु एक वस्तु

का एक उदाहरण जब यह

lblTest.Text = value; 

उद्देश्य यह है कि मान शून्य होगा सेट करने का प्रयास करने के लिए सेट नहीं संदर्भ:

यह एक अपवाद फेंकता lblTest

क्या मैं उपयोगकर्ता नियंत्रण को सही ढंग से नहीं जोड़ रहा हूं? क्या मुझे टैग करना होगा - या मुझे टैग दर्ज करते समय Src संपत्ति निर्दिष्ट करनी चाहिए? यदि ऐसा है, तो मुझे उपयोग करने वाले प्रत्येक उपयोगकर्ता नियंत्रण को पंजीकृत करना होगा?

इसके परिणामस्वरूप उपयोगकर्ता नियंत्रण में कोई नियंत्रण लोड नहीं होता है और सभी नियंत्रण उपयोगकर्ता नियंत्रण में शून्य होते हैं।

<%@ Register TagPrefix="uc1" TagName="NavTop" Src="controls/NavTop.ascx" %> 

हालांकि, अगर आप एक से अधिक पृष्ठ में उपयोगकर्ता नियंत्रण इस का उपयोग करें, तो आप कर सकते हैं:

उत्तर

27

उपयोगकर्ता नियंत्रण अपने वर्तमान प्रोजेक्ट में है, तो आप रजिस्टर बयान में src शामिल करने की ज़रूरत भी web.config में इसे पंजीकृत:

<system.web> 
    <pages> 
    <controls> 
     <add tagPrefix="uc1" tagName="NavTop" src="~/controls/NavTop.ascx" /> 
    </controls> 
    </pages> 
</system.web> 

एक अन्य बात से अवगत होना: कई बार जब दृश्य स्टूडियो डिजाइनर नहीं अपने परिवर्तनों को नियंत्रण करने के लिए पृष्ठ पर "देख" है अगर आप केवल में परिवर्तन करने के देखते हैं स्रोत दृश्य यदि आप नियंत्रण नाम बदलते हैं, उदाहरण के लिए, आप एसीएक्स में नए नाम के साथ नियंत्रण के साथ समाप्त हो सकते हैं लेकिन डिजाइनर फ़ाइल में पुराने नाम के साथ नियंत्रण के संदर्भ में। रनटाइम पर, इसके परिणामस्वरूप डिज़ाइनर फ़ाइल प्रॉपर्टी शून्य हो जाएगी।

कई बार इसे जलाने के बाद, अगर मैं स्रोत दृश्य में कोई बदलाव करता हूं, तो मैं या तो यह देखने के लिए जांच करता हूं कि डिजाइनर फ़ाइल सही तरीके से अपडेट की गई है या मैं डिज़ाइन व्यू पर स्विच करता हूं, मामूली परिवर्तन करता हूं, फिर पेज/उपयोगकर्ता नियंत्रण को बचाओ।

+1

धन्यवाद @competent_tech वेब.कॉन्फिग में नियंत्रण पंजीकृत करने के बारे में मैंने जो बात देखी, वह यह है कि यदि नियंत्रण एक ही निर्देशिका में नियंत्रणों का एक समग्र नियंत्रण है - तो एक त्रुटि होगी। अगर कोई मुझे यह समझा सकता है, तो मुझे यह जानना अच्छा लगेगा कि वह क्यों है। – VFein

5

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

कुछ इस तरह:

//Page 
protected void Page_Load(object sender, EventArgs e) 
{ 
    test.Text = "Hello World!"; 
} 

//User Control 
public string Text {get; set;} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    lblTest.Text = Text; 
} 
1

पेज के Page_prerender घटना पर कोड रखने का प्रयास करें। यह आपके लिए काम करेगा।

+0

पॉपुलटिंग नियंत्रणों के लिए प्रीरेंडर का उपयोग करने में समस्या यह है कि यदि नियंत्रण में कोई भी घटना है जो अन्य नियंत्रणों के साथ बातचीत करती है, तो डेटा लोड होने के दौरान पॉपुलर होने तक गायब हो जाएगा। यदि आप लोड के दौरान अपने नियंत्रण को पॉप्युलेट करते हैं तो आपके पास प्रीरेंडर के दौरान वह डेटा पहुंच योग्य होगा। लोड -> घटनाक्रम आग -> प्रीरेंडर। प्रीरेंडर का उपयोग तब किया जाना चाहिए जब आप यह सुनिश्चित करना चाहते हैं कि डेटा पुराना नहीं है (शायद किसी ईवेंट द्वारा बदला गया हो)। –

+0

ध्यान दें कि पेज। प्रीरेंडर पृष्ठ के बाद होता है। पृष्ठ पर लोड और कोई भी नियंत्रण उनके लोड ईवेंट को फायर कर रहा है ... पृष्ठ से पहले वास्तव में प्रतिपादन। डेटा को नियंत्रण में बांधने का आखिरी मौका है। –

+0

यह मेरे लिए काम नहीं किया –

1

मुझे यह समस्या थी जब मैं गलत तरीके से कोड में उपयोगकर्ता नियंत्रण जोड़ रहा था। नियंत्रण को प्रारंभ करने के लिए आपको पेज.लोड कंट्रोल विधि का उपयोग करना होगा, आप केवल नए का उपयोग नहीं कर सकते हैं।

 //WRONG 
     UserControls.BingoCardPage bcp = new UserControls.BingoCardPage(); 
     form1.Controls.Add(bcp); 
     //RIGHT 
     UserControls.BingoCardPage bcp = (UserControls.BingoCardPage)Page.LoadControl("~/UserControls/BingoCardPage.ascx"); 
     form1.Controls.Add(bcp); 
संबंधित मुद्दे