2008-09-18 20 views
6

पर ईवेंट को संभालने में सक्षम नहीं है। मेरे पास एक उपयोगकर्ता नियंत्रण है जो पेज के इनिट में निम्न कोड का उपयोग करके पृष्ठ में लोड किया गया है।उपयोगकर्ता नियंत्रण गतिशील रूप से पोस्टबैक

Dim oCtl As Object 
oCtl = LoadControl("~/Controls/UserControl1.ascx") 

oCtl.Id = "UserControl11" 
PlaceHolder1.Controls.Clear() 
PlaceHolder1.Controls.Add(oCtl) 

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

उत्तर

1

कुछ सवाल:

  1. पेज जीवन चक्र में किस बिंदु पर आप नियंत्रण लोड करूं?
  2. ईवेंट हैंडलर कोड कहां है? नियंत्रण में या आप इसे पृष्ठ पर हुक करने की कोशिश करते हैं?
  3. आपने इस घटना को तारित करने के लिए अब तक क्या किया है?

अंत में, नेट के लिए शैली दिशा निर्देशों विशेष रूप से oCtl में ओ की तरह किसी भी hugarian उपसर्ग मौसा का उपयोग कर के खिलाफ की सलाह देते हैं, और आप एक नियंत्रण के बजाय एक वस्तु के रूप में यह टाइप करना चाहिए।

+0

प्वाइंट हंगेरी उपसर्ग के लिए स्वीकार किया गया है, भविष्य में इसे ध्यान में रखेगा। मैं नीचे एक टिप्पणी में पूरा कोड पेस्ट करने जा रहा हूँ। आपकी प्रतिक्रिया –

3

सुनिश्चित करें कि आप हर पोस्टबैक पर नियंत्रण से लोड करना न केवल नियंत्रण लोड करना चाहते हैं - अगर नियंत्रण नियंत्रण के पेड़ में नहीं है जब पेज पदों वापस, ASP.NET नहीं होगा बटन क्लिक घटना बढ़ाएं।

5

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

0

यहाँ पृष्ठ

Partial Class DynamicLoad 
    Inherits System.Web.UI.Page 

    Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init 
     If IsPostBack Then 
      If Not (Session("ctl") Is Nothing) Then 
       Dim oCtl As Object 
       oCtl = Session("ctl") 
       PlaceHolder1.Controls.Add(oCtl) 
      End If 
     End If 
    End Sub 


    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     If Not IsPostBack Then 
      Dim oCtl As Object 
      oCtl = LoadControl("~/Controls/UserControl1.ascx") 

      oCtl.Id = "UserControl11" 
      PlaceHolder1.Controls.Clear() 
      PlaceHolder1.Controls.Add(oCtl) 

      Session("ctl") = oCtl 
     End If 
    End Sub 
End Class 

यहाँ के लिए पूरा कोड है उपयोगकर्ता नियंत्रण

Partial Class UserControl1 
    Inherits System.Web.UI.UserControl 
    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Label1.Text = "This is Text AFTER Post Back in User Control 1" 
    End Sub 
End Class 
0

के लिए पूरा कोड के बाद से आप से पूछा, मैं इस तरह अपने init घटना लिखना चाहते हैं। मैं एक व्यायाम के रूप लोड घटना छोड़ देंगे:

Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init 
    If IsPostBack AndAlso Session("ctl") IsNot Nothing Then 
     Dim MyControl As Control = Session("ctl") 
     PlaceHolder1.Controls.Add(MyControl) 
    End If 
End Sub 

मैं भी 'myControl' की तुलना में एक बेहतर नाम के साथ आते हैं, लेकिन जब से मैं नहीं जानता कि क्या नियंत्रण करता है यह करने के लिए होगा।

+0

की सराहना करेंगे लेकिन यह वास्तव में मेरी पोस्टबैक समस्या को –

0

मुझे यह कोशिश किए बिना पता नहीं है, लेकिन क्या होगा यदि आप प्रोग्राम के रूप में बटन के ईवेंट हैंडलर को व्यवस्थित करते हैं? उदाहरण के लिए, उपयोगकर्ता नियंत्रण के लिए ही कोड-पीछे, Init या लोड (नहीं यकीन है कि) में में:

AddHandler Button1.Click, AddressOf Button1_Click 

कि कुछ भी नहीं है, तो मैं जानता हूँ कि यह कम कुशल है, लेकिन आप क्या डॉन अगर ' सत्र में उपयोगकर्ता नियंत्रण उदाहरण को स्टोर नहीं करते हैं और हमेशा इसे हर समय पेज_इनिट में पुन: बनाते हैं?

10

कुछ ऐसी चीजें हैं जो आप कर रहे हैं जो दोनों की आवश्यकता नहीं है और शायद आपकी समस्याएं पैदा कर रही हैं।

ये हैं:

  1. सत्र में नियंत्रण वस्तु स्टोर करने के लिए कोई जरूरत नहीं है।नियंत्रण को स्वयं को आवश्यक जानकारी के रूप में आवश्यक जानकारी संग्रहीत करने के लिए व्यूस्टेट और सत्र राज्य का उपयोग करना चाहिए।
  2. नियंत्रण बनाते समय आपको पोस्टबैक की जांच नहीं करनी चाहिए। इसे प्रत्येक बार व्यूस्टेट को काम करने की अनुमति देने के लिए बनाया जाना चाहिए और घटना को वायर्ड किया जाना चाहिए।
  3. व्यूस्टेट लोड होने के बाद लोड किए गए नियंत्रणों को अक्सर सही ढंग से परिचालन करने में परेशानी होती है इसलिए जहां भी संभव हो पृष्ठ लोड ईवेंट के दौरान लोड होने से बचें।

इस कोड मेरे लिए काम करता है:


Default.aspx

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="Test_User_Control._Default" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"><title></title></head> 
<body> 
    <form id="form1" runat="server"> 
     <asp:PlaceHolder ID="PlaceHolder1" runat="server" /> 
    </form> 
</body> 
</html> 

Default.aspx.vb

Partial Public Class _Default 
    Inherits System.Web.UI.Page 

    Private Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init 

     Dim control As Control = LoadControl("~/UserControl1.ascx") 
     PlaceHolder1.Controls.Add(control) 

    End Sub 
End Class 

UserControl1.ascx

<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="UserControl1.ascx.vb" Inherits="Test_User_Control.UserControl1" %> 
<asp:Label ID="Label1" Text="Before Button Press" runat="server" /> 
<asp:Button ID="Button1" Text="Push me" runat="server" /> 

UserControl1.ascx.vb

Public Partial Class UserControl1 
    Inherits System.Web.UI.UserControl 

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Label1.Text = "The button has been pressed!" 
    End Sub 

End Class 

2

मैं सिर्फ समान समस्या का अनुभव के रूप में तुमने किया था, सिवाय इसके कि मेरे मामले में मैं इस्तेमाल किया नहीं था एक नियंत्रण स्टोर करने के लिए सत्र।

मेरे मामले में, मैं इस पंक्ति में समस्या स्थित:

PlaceHolder1.Controls.Clear()

क्या मैंने किया एक बच्चे नियंत्रण बनाई गई है और उन्हें Page_Init पर पैरेंट कंटेनर को जोड़ा गया है, तो कुछ ईवेंट हैंडलर्स संसाधित और बाद कि पेज_PreRender पर मैंने अद्यतन सूची के साथ पूरी सूची फिर से बनाई।

इस मामले में उपयोग किया जाने वाला समाधान पृष्ठ चक्र के प्रारंभिक चरण में - एक बार नियंत्रण संग्रह बनाना था।

+0

हां से नियंत्रित नहीं करता है, यह मेरी समस्या भी थी :) thanx – Marko

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

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