2012-07-30 15 views
6

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

मेरे पास एक वेब एप्लिकेशन है जो एक मास्टर पेज का उपयोग करता है। मैं एक उपयोगकर्ता नियंत्रण जोड़ रहा हूं जिसे मैंने सामग्री पृष्ठों में से एक को लिखा था। मैंने टूलबॉक्स से ड्रैग और ड्रॉप करके एएसपीएक्स पेज पर उपयोगकर्ता नियंत्रण जोड़ा। मैं पीछे कोड से उपयोगकर्ता नियंत्रण देखने में सक्षम हूं, लेकिन मैं सार्वजनिक कार्यों तक नहीं पहुंच सकता। उस समस्या को ठीक करने के लिए, मैंने कोड के पीछे उपयोगकर्ता नियंत्रण का एक ऑब्जेक्ट बनाया और लोडकंट्रोल फ़ंक्शन का उपयोग किया। यह सब ठीक काम करता प्रतीत होता है।

मेरी समस्या यह है कि जब मैं EventHandler को एएसपीएक्स पृष्ठ से उपयोगकर्ता नियंत्रण में हुक करने की कोशिश कर रहा हूं। सबकुछ संकलित करता है और ठीक चलता है, लेकिन मुझे पेज पर कुछ भी नहीं दिख रहा है। मुझे लगता है कि मुद्दा यह है कि EventHandler हमेशा शून्य है।

उपयोगकर्ता नियंत्रण कोड

public partial class ucBuyerList : System.Web.UI.UserControl 
{ 
    public delegate void BuyerSelectedEventHandler(object sender, EventArgs e); 
    public event BuyerSelectedEventHandler BuyerSelected; 

    private string name = ""; 
    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 

    private string auid = ""; 
    public string AUID 
    { 
     get { return auid; } 
     set { auid = value; } 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    private void OnBuyerSelected(EventArgs e) 
    { 
     if (BuyerSelected != null) 
     { 
      BuyerSelected(this, new EventArgs()); 
     } 
    } 

    protected void lbBuyerList_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     SetNameAndAUID(); 
     OnBuyerSelected(e); 
    } 

    private void SetNameAndAUID() 
    { 
     name = lbBuyerList.SelectedItem.Text; 
     auid = lbBuyerList.SelectedItem.Value; 
    } 
} 

जनक पृष्ठ कोड

public partial class frmBuyerInformation : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     Master.changePageTitle("Buyer Information"); 
     buyerList.BuyerSelected += new ucBuyerList.BuyerSelectedEventHandler(buyerListControl_BuyerSelected); 
    } 

    void buyerListControl_BuyerSelected(object sender, EventArgs e) 
    { 
     DisplayBuyerInformation(); 
    } 

    public void DisplayBuyerInformation() 
    { 
     tbName.Text = buyerList.Name; 
     tbAUID.Text = buyerList.AUID; 
    } 
} 

किसी को भी मैं गलत क्या कर रहा हूँ देख सकते हैं?

संपादित करें: यह समस्या हल हो गई है। उपरोक्त कोड स्निपिट अब कार्यात्मक हैं। यदि कोई मेरे पास इस मुद्दे पर चलता है, तो आप ऊपर दिए गए कोड को मॉडल कर सकते हैं। सुनिश्चित करें कि AutoEventWireup="true" दोनों एएसपीएक्स और एसीएक्स पृष्ठों में। आपके समाधान के लिए जून पैक धन्यवाद। आपके इनपुट के लिए डिएगो डी वीटा भी धन्यवाद।

+0

'अगर (खरीदार चयन! = शून्य) {क्रेता चयन (यह, ई); } 'यह कभी मत करो! यह कोड दौड़ की स्थिति बनाता है। यह उचित मुहावरे है: 'var h = खरीदार चयन; अगर (एच! = नल) एच (यह, ई); ' – cdhowie

+0

मैंने कुछ और सेकंड पहले कुछ और लिखा था .. क्षमा करें .. वास्तव में मैंने आपकी टिप्पणी देखी और शायद मैं सहमत नहीं हूं। मैं हमेशा इस तरह इवेंट क्लास आग। इसका मतलब है: घटना से जुड़े किसी भी मामले में ईवेंट ईवेंट हैंडलर को कॉल करें। अब मैंने सावधानी से सवाल नहीं पढ़ा है इसलिए मेरे पास कोई जवाब नहीं है। बस यह कहकर कि आपकी आखिरी टिप्पणी सही नहीं है –

+0

मुझे आश्चर्य है कि क्या आपने वास्तव में lbBuyerList_SelectedIndex को एएसपीएक्स नियंत्रण में घोषित उचित टैग विशेषता को संशोधित करने के रूप में एएसपीनेट नियंत्रण पर इस तरह के एक ईवेंट के हैंडलर के रूप में परिवर्तित किया है। आप प्रत्येक चरण (उस विधि के शरीर से शुरू) पर ब्रेकपॉइंट्स का उपयोग करने का प्रयास कर सकते हैं और उस कोड को कॉल करने पर डीबग के दौरान खोज सकते हैं। –

उत्तर

2

मैं कुछ समय के लिए भी घटनाओं के साथ संघर्ष कर रहा हूं। आजकल मैं हमेशा उन्हें इस तरह से बना देता हूं 'क्योंकि यह एकमात्र तरीका है जिसे मैं जानता हूं कि यह काम करता है। अपने कोड के साथ यह परीक्षण नहीं किया, लेकिन यहाँ यह वैसे भी चला जाता है:

public partial class ucBuyerList : System.Web.UI.UserControl 
{ 
    public delegate void BuyerSelectedEventHandler(object sender, EventArgs e); 

    public event BuyerSelectedEventHandler BuyerSelected; 

    public string Name; 
    public string AUID; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     //Select the first buyer in the list when the user control loads 

     if (!IsPostBack) 
     { 
      lbBuyerList.SelectedIndex = 0; 
     } 
    } 

    private void OnBuyerSelected(EventArgs e) 
    { 
     BuyerSelectedEventHandler handler = BuyerSelected; 
     if (handler != null) 
     { 
      handler(this, new EventArgs()); 
     } 
    } 

    protected void lbBuyerList_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     Name = lbBuyerList.SelectedItem.Text; 
     AUID = lbBuyerList.SelectedItem.Value; 
     OnBuyerSelected(e); 
    } 
} 

पैरेंट पृष्ठ तुम सिर्फ अपने कार्य आप यह पहले से ही कर रहे हैं उसी तरह फोन सकते हैं।

+0

विभिन्न दृष्टिकोण के लिए धन्यवाद। मैंने इस कोड का उपयोग करने का प्रयास किया लेकिन मुझे अभी भी पता चला है कि "हैंडलर" ऑब्जेक्ट शून्य है। –

+0

हालांकि यह एक जंगली अनुमान है, लेकिन क्या आपने अपने माता-पिता के पेज पेज_लोड को एक if (! पेज.इस्स्टबैक) में लपेटने की कोशिश की है? –

+0

मैंने ऊपर वर्णित विधि का उपयोग करने के लिए अपना कोड बदल दिया। यह पहले काम नहीं किया था। मुझे एएसपीएक्स और एसीएक्स पृष्ठों दोनों में AutoEventWireup = "true" बनाना था। आपकी मदद के लिए बहुत बहुत शुक्रिया। अगर मैं ऐसी स्थिति में भाग लेता हूं तो मैं दूसरों के लिए कोड पोस्ट कर दूंगा। –

1

यह हो सकता है कि Page_Load पृष्ठ जीवन चक्र में लोडकंट्रोल का उपयोग करने और घटना की सदस्यता लेने के लिए बहुत देर हो चुकी है। क्या होता है यदि आप उस कोड को Page_Init विधि पर ले जाते हैं?

+0

जो एक अच्छा बिंदु हो सकता है। आम तौर पर मैं प्रोग्रामेटिक रूप से नहीं, घोषणात्मक ascx पर उपयोगकर्ता नियंत्रण जोड़ता हूं। –

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