2008-10-27 21 views
15

LoadControl(type, Params) का उपयोग करते समय मुझे कोई समस्या है। मुझे स्पष्ट करने दें ...Asp.net Usercontrol LoadControl Issue

मैं एक सुपर सरल उपयोगकर्ता नियंत्रण है (ascx)

<%@ Control Language="C#" AutoEventWireup="True" Inherits="ErrorDisplay" Codebehind="ErrorDisplay.ascx.cs" EnableViewState="false" %> 

<asp:Label runat="server" ID="lblTitle" /> 
<asp:Label runat="server" ID="lblDescription" /> 
साथ कोड (ग #)

के पीछे:

public partial class ErrorDisplay : System.Web.UI.UserControl 
{ 

    private Message _ErrorMessage;  

    public ErrorDisplay() 
    { 
    } 

    public ErrorDisplay(Message ErrorMessage) 
    { 
     _ErrorMessage = ErrorMessage; 
    }  

    protected override void OnPreRender(EventArgs e) 
    { 
     base.OnPreRender(e); 

     if (_ErrorMessage != null) 
     { 
      lblTitle.Text = _ErrorMessage.Message; 
      lblDescription.Text = _ErrorMessage.Description; 
     } 
    } 
} 
कहीं और मेरी वेब अनुप्रयोग में

जोड़ा जा रहा निम्नलिखित कोड का उपयोग कर पृष्ठ पर उपयोगकर्ता नियंत्रण का एक उदाहरण:

divValidationIssues.Controls.Add(LoadControl(typeof(ErrorDisplay), new object[] { MessageDetails })); 

मैं ओवरलोडेड संस्करण का उपयोग कर रहा हूं LoadControl क्योंकि मैं कन्स्ट्रक्टर को संदेश पैरामीटर पास करना चाहता हूं। यह ठीक है काम करने के लिए यह प्रतीत होता है।

हालांकि, OnPreRender() को त्रुटि डिस्प्ले उपयोगकर्ता नियंत्रण पर निकाल दिया गया है, तो lblTitle और lblDescription चर दोनों null दोनों हैं, उनके पास मार्कअप समकक्ष होने के बावजूद। संदेश चर सही ढंग से आबादी में किया गया है।

क्या कोई भी ऐसा हो सकता है कि यह क्यों हो रहा है?

धन्यवाद

संपादित करें:

बस स्पष्टता के लिए मैं भी है कि कोड है जो प्रोग्राम के पृष्ठ पर usercontrol जोड़ रहा है एक बटन दबाने की के जवाब में चल रहा है, इसलिए 'की मेजबानी जोड़ देंगे पृष्ठ 'ने इनेट, पेज_लोड के माध्यम से प्रगति की है और अब ईवेंट हैंडलर को संसाधित कर रहा है।

मैं पहले एएसपी लाइफसाइकिल चरण में उपयोगकर्ता नियंत्रण जोड़ नहीं सकता क्योंकि वे बटन क्लिक ईवेंट के जवाब में बनाए जा रहे हैं।

उत्तर

19

मैं निम्नलिखित कोड की कोशिश की है और साथ ही - जो एक ही परिणाम पैदावार (यानी दोनों lblTitle और lblDescription अशक्त हैं)

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (_ErrorMessage != null) 
    { 
     lblTitle.Text = _ErrorMessage.Message; 
     lblDescription.Text = _ErrorMessage.Description; 
    } 
} 

मैं समझता हूँ कि LoadControl समारोह नियंत्रण यह अप करने के लिए लोड कर रहा है लाया था उस पृष्ठ का वर्तमान 'राज्य' जिस पर इसे शामिल किया जा रहा है। इसलिए Init, Page_Load आदि सभी लोडकंट्रोल कॉल के हिस्से के रूप में चलाए जाते हैं।

दिलचस्प बात यह है कि (अनुत्तरित) asp.net फ़ोरम पोस्ट एक ही समस्या का प्रदर्शन करता है जैसा कि मैं अनुभव कर रहा हूं।

MSDN Forums Post

इसके अतिरिक्त

- MSDN से:

आप एक कंटेनर नियंत्रण में एक नियंत्रण लोड करते हैं, कंटेनर जोड़ा नियंत्रण की घटनाओं के सभी जब तक यह मौजूदा घटना के लिए पकड़ा गया है उठाती है। हालांकि, जोड़ा गया नियंत्रण पोस्टबैक डेटा प्रोसेसिंग के साथ नहीं पकड़ता है।सत्यापन के साथ पोस्टबैक डेटा प्रोसेसिंग में भाग लेने के लिए एक अतिरिक्त नियंत्रण के लिए, लोड ईवेंट की बजाय इनिट इवेंट में नियंत्रण जोड़ा जाना चाहिए।

इसलिए लोडकंट्रोल सही ढंग से नियंत्रण को निष्क्रिय नहीं करना चाहिए?

संपादित करें:

ठीक है, इसलिए मैं अपने ही सवाल का जवाब दे यहाँ .. हूँ

मैं मंच पोस्ट मैं ऊपर Here

अनिवार्य रूप से इस सवाल का जवाब करने के लिए जोड़ा का एक जवाब संस्करण पाया यह है कि LoadControl(type, params) 'पृष्ठ के सामने' ascx को पार्स करने का अनुमान नहीं लगा सकता है और इसलिए यह किसी भी नियंत्रण को निष्क्रिय करने से परेशान नहीं करता है। जब आप LoadControl("ascx path") संस्करण का उपयोग करते हैं तो इसे पृष्ठ को सामने दिया जाता है और इसलिए सभी पार्सिंग और इनटाइटलेशन होता है।

तो संक्षेप में मुझे उस कोड को बदलने की जरूरत है जो नियंत्रण को निष्क्रिय कर रहा है और इसे अलग हिस्सों में विभाजित करता है। अर्थात।

Control ErrorCntrl = LoadControl("ErrorDisplay.ascx"); 
ErrorCntrl.ID = SomeID; 
(ErrorCntrl as ErrorDisplay).SetErrorMessage = MessageDetail; 
divErrorContainer.Controls.Add(ErrorCntrl); 

और यह ठीक काम करना चाहिए .. यह मेरे पिछले प्रयास के रूप में साफ नहीं है, लेकिन कम से कम यह काम करेगा।

मैं अभी भी ऊपर सुधारने के लिए सुझावों के लिए खुला हूं।

चीयर्स

+3

+1 और मेरी समस्या को हल करने के लिए धन्यवाद, धन्यवाद। :) –

+0

उत्कृष्ट अनुवर्ती! –

-1

एएसपीनेट पृष्ठ जीवन चक्र के अनुसार आपके नियंत्रण पूर्व-प्रस्तुत में पूरी तरह से जोड़े नहीं गए हैं, आप पेज_लोड में मूल्यों को क्यों लोड नहीं करते हैं?

+1

पर कैलेंडर DayRender घटना के पीछे UserControl

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load End Sub Public Sub Add(txt As String) Dim li As New ListItem(txt, txt) lstDay.Items.Add(li) End Sub 

समाप्ति कक्षा

पेज ASPX मार्कअप

कोड यह सही नहीं है। [लोड के बाद प्रीरेंडर होता है।] (Http://msdn.microsoft.com/en-us/library/ms178472.aspx#lifecycle_events) 'पृष्ठ ऑब्जेक्ट के बाद उठाए गए सभी नियंत्रणों को बनाया गया है' – Chris

0

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

+1

[प्रीरेंडर * लोड के बाद होता है] (http://msdn.microsoft.com/en-us/library/ms178472.aspx#lifecycle_events), इसलिए प्रीरेंडर सुरक्षित होना चाहिए। – Chris

0

वैसे वहाँ हमेशा अपनी लोड घटना जोड़ने और यह बुला के बाद आप निर्माता भाग गया और पृष्ठ पर नियंत्रण को शामिल किया है, लेकिन यह क्या है की तुलना में बहुत अलग नहीं है, हालांकि मैं चुन सकते है यह शैली के कारणों के लिए।

खुशी है कि आपको अपनी समस्या का उत्तर मिला!

0

Here स्टीवन रॉबिन्स द्वारा लिखित एक ब्लॉग पोस्ट है। पोस्ट LoadControl, LoadControl(Type, object[]) क्या करेंगे के लिए इसी तरह का उपयोग कर एक उपयोगकर्ता नियंत्रण के लिए पैरामीटर भेजने का तरीका बताता है, यह छोड़कर काम करता है :)

0

मैं कैलेंडर नियंत्रण DayRender घटना के साथ एक समान मुद्दा था, कि मैं जोड़ना चाहते थे उपयोगकर्ता को e.Cell.Controls संग्रह पर नियंत्रण। उपयोगकर्ता नियंत्रण के साथ कुछ असफल दृष्टिकोणों की कोशिश करने के बाद पेज_लोड फ़ायरिंग नहीं है या एएसएक्स पर एक नल अपवाद फेंकने पर सूची बॉक्स, मैंने पाया कि अगर मैंने लोडकंट्रोल (एसीएक्स) के साथ फॉर्म पर अपना नियंत्रण शुरू किया और फिर मार्कअप नियंत्रणों को एक्सेस करना शुरू किया ascx, सब कुछ ठीक काम किया। यह दृष्टिकोण एसीएक्स पर पेज_लोड ईवेंट पर निर्भर नहीं है।

ASCX मार्कअप

पीछे

सार्वजनिक कक्षा CPCalendarCell विरासत में मिली System.Web.UI कोड।प्रपत्र

Private Sub Calendar1_DayRender(sender As Object, e As System.Web.UI.WebControls.DayRenderEventArgs) Handles Calendar1.DayRender 
    Dim div As CPCalendarCell = LoadControl("~/UserControls/CPCalendarCell.ascx") 
    div.ID = "dv_" & e.Day.Date.ToShortDateString.Replace(" ", "_") 

    **e.Cell.Controls.Add(div)** 

    div.Add(e.Day.Date.Month.ToString & "/" & e.Day.Date.Day.ToString) 
    div.Add("Item 1") 
    div.Add("Item 2") 
    e.Cell.Style.Add("background-color", IIf(e.Day.IsWeekend, "whitesmoke", "white").ToString) 
End Sub