2010-11-04 13 views
8

मेरे उपयोगकर्ता नियंत्रण पर मूल पृष्ठ से किसी संपत्ति तक पहुंचने का प्रयास कर रहा है।उपयोगकर्ता नियंत्रण से अभिभावक पृष्ठ संपत्ति

यहाँ मेरी default.asp codebehind की शुरुआत है:

Partial Class _Default 
    Inherits System.Web.UI.Page 

    Private _selectedID As String = "74251BK3232" 

    Public Property SelectedID() As String 
      Get 
       Return _selectedID 
      End Get 
      Set(ByVal value As String) 
       _selectedID = value 
      End Set 
    End Property 

यहाँ मेरी उपयोगकर्ता नियंत्रण codebehind की शुरुआत है:

Partial Class ctrlAddAttribute 
    Inherits System.Web.UI.UserControl 
    Dim selectedID As String = Me.Parent.Page.selectedID() 

मैं त्रुटि मिल रही है "selectedID का सदस्य नहीं है System.Web.UI.Page "

कृपया सलाह दें!

उत्तर

9

जब आप पृष्ठ को अपने वास्तविक कार्यान्वयन के लिए _Default कहते हैं तो आप उस संपत्ति तक पहुंच सकते हैं।

Dim selectedID As String = DirectCast(Me.Page,_Default).selectedID() 

लेकिन यह उपयोगकर्ता नियंत्रण (पुन: प्रयोज्यता) का उद्देश्य नहीं है। आम तौर पर आप नियंत्रक (पृष्ठ) से आईडी को UserControl पर आईडी देंगे।

तो UserControl में एक संपत्ति को परिभाषित करें और इसे पृष्ठ से सेट करें। इस तरह UserControl अभी भी अन्य पृष्ठों में काम करेगा।

+1

धन्यवाद टिम, मैं आपकी सलाह ले लिया। मैंने अपने नियंत्रण में एक सार्वजनिक संपत्ति जोड़ा और उस पृष्ठ से सेट किया जब मैंने गतिशील रूप से इसे जोड़ा! – s15199d

1

क्योंकि उपयोगकर्ता नियंत्रण पृष्ठ से संबंधित नहीं है, इसलिए आप सीधे तब तक इसका उपयोग नहीं कर सकते जब तक कि आप या तो पृष्ठ सहित उपयोगकर्ता नियंत्रण में कोई संपत्ति सेट नहीं करते हैं या एक रिकर्सिव फ़ंक्शन बनाते हैं जो सभी मूल ऑब्जेक्ट्स के माध्यम से चक्र चलाता है जब तक कि यह System.Web.UI.Page प्रकार का ऑब्जेक्ट न पाएं।

पहले के लिए, आप एक संपत्ति इस्तेमाल कर सकते हैं (मैं ऐसा करने के बाद एक संपत्ति बुलाया ParentForm का प्रयोग करके) उपयोगकर्ता नियंत्रण में:

Private _parentForm as System.Web.UI.Page 
Public Property ParentForm() As System.Web.UI.Page ' or the type of your page baseclass 
    Get 
     Return _parentForm 
    End Get 
    Set 
     _parentForm = value 
    End Set 
End Property 

"पिता" पृष्ठ में, आप में इस संपत्ति स्थापित करेगा जितनी जल्दी हो सके एक घटना। मैं प्रीलोड का उपयोग करना पसंद करता हूं क्योंकि यह लोड से पहले आता है (इस प्रकार उपलब्ध है जब अधिकांश अन्य नियंत्रणों की आवश्यकता होगी) और init के बाद।

Protected Sub Page_PreLoad(ByVal sender as Object, ByVal e as EventArgs) Handles Me.PreLoad 
    Me.myUserControlID.ParentForm = Me 
End Sub 

आप पृष्ठ को खोजने के लिए अभिभावक नियंत्रणों के माध्यम से फ़ंक्शन ट्रोल भी लिख सकते हैं। निम्नलिखित कोड अनचाहे है इसलिए इसे ट्वीविंग की आवश्यकता हो सकती है, लेकिन विचार ध्वनि है।

Public Shared Function FindParentPage(ByRef ctrl As Object) As Page 
    If "System.Web.UI.Page".Equals(ctrl.GetType().FullName, StringComparison.OrdinalIgnoreCase) Then 
     Return ctrl 
    Else 
     Return FindParentPage(ctrl.Parent) 
    End If 
End Function 

संपादित करें: आप इसलिए भी कि यह प्रकार System.Web.UI.Page भीतर मौजूद नहीं है सीधे इस संपत्ति का उपयोग नहीं कर सकते हैं। चूंकि @ टिम श्मेलर अनुशंसा करता है, आप या तो पृष्ठ को विशिष्ट पृष्ठ प्रकार _Default पर डालने का प्रयास कर सकते हैं या यदि यह आपके कई पृष्ठों के लिए कुछ आम है, तो आपको उस बेस क्लास क्लास को बनाने और उस श्रेणी में अपनी संपत्ति शामिल करने की आवश्यकता हो सकती है। तो फिर तुम पेज में फिर System.Web.UI.Page

Public Class MyBasePage 
    Inherits System.Web.UI.Page 

    Public Property SelectedID() as Integer 
     ... 
    End Property 
End Class 

के बजाय इस वर्ग के वारिस कर सकते हैं:

Partial Class _Default 
    Inherits MyBasePage 

    ... 

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