2008-09-01 8 views
5

मेरे पास एक विस्तारक नियंत्रण है जो उपयोगकर्ता ने टाइपिंग समाप्त होने के बाद टेक्स्टबॉक्स का OnTextChanged ईवेंट 500ms बढ़ाया है। इसके साथ समस्या यह है कि OnTextChanged उठाया जाता है जब टेक्स्टबॉक्स फोकस खो देता है, जिससे समस्याएं होती हैं (पोस्टबैक के कारण)।विस्तारक नियंत्रण में सर्वर-साइड इवेंट जोड़ना

मैं जो करना चाहता हूं वह विस्तारक नियंत्रण को अपने सर्वर-साइड इवेंट (कहें, OnDelayedSubmit) दें ताकि मैं इसे अलग से संभाल सकूं। यह कार्यक्रम विस्तारक नियंत्रण की व्यवहार स्क्रिप्ट (500ms देरी के बाद) में उत्पन्न होगा, इसलिए onchanged में __doPostBack डालना एक विकल्प नहीं है।

क्या कोई इस बारे में प्रकाश डालने के बारे में प्रकाश डाल सकता है?

उत्तर

5

विस्तारक नियंत्रण और जावास्क्रिप्ट पर पढ़ने के बाद, मैंने एक समाधान को एक साथ जोड़ दिया है जो अब तक काम कर रहा है।

मुख्य चाल सर्वर-साइड से क्लाइंट-साइड व्यवहार स्क्रिप्ट में आवश्यक पोस्टबैक कोड प्राप्त कर रही थी। मैंने ExtenderControlProperty (जो नियंत्रण के OnPreRender फ़ंक्शन में सेट है) का उपयोग करके ऐसा किया, और फिर व्यवहार स्क्रिप्ट में eval'd। शेष बुनियादी घटना-हैंडलिंग सामान था।

तो अब मेरी एक्सटेंडर नियंत्रण के .cs फ़ाइल कुछ इस तरह दिखता है:

public class DelayedSubmitExtender : ExtenderControlBase, IPostBackEventHandler 
{ 
    // This is where we'll give the behavior script the necessary code for the 
    // postback event 
    protected override void OnPreRender(EventArgs e) 
    { 
     string postback = Page.ClientScript.GetPostBackEventReference(this, "DelayedSubmit") + ";"; 
     PostBackEvent = postback; 
    } 

    // This property matches up with a pair of get & set functions in the behavior script 
    [ExtenderControlProperty] 
    public string PostBackEvent 
    { 
     get 
     { 
      return GetPropertyValue<string>("PostBackEvent", ""); 
     } 
     set 
     { 
      SetPropertyValue<string>("PostBackEvent", value); 
     } 
    } 

    // The event handling stuff 
    public event EventHandler Submit; // Our event 

    protected void OnSubmit(EventArgs e) // Called to raise the event 
    { 
     if (Submit != null) 
     { 
      Submit(this, e); 
     } 
    } 

    public void RaisePostBackEvent(string eventArgument) // From IPostBackEventHandler 
    { 
     if (eventArgument == "DelayedSubmit") 
     { 
      OnSubmit(new EventArgs()); 
     } 
    } 

} 

और मेरे व्यवहार स्क्रिप्ट इस तरह दिखता है:

DelayedSubmitBehavior = function(element) { 
    DelayedSubmitBehavior.initializeBase(this, [element]); 

    this._postBackEvent = null; // Stores the script required for the postback 
} 

DelayedSubmitBehavior.prototype = { 
    // Delayed submit code removed for brevity, but normally this would be where 
    // initialize, dispose, and client-side event handlers would go 

    // This is the client-side part of the PostBackEvent property 
    get_PostBackEvent: function() { 
     return this._postBackEvent; 
    }, 
    set_PostBackEvent: function(value) { 
     this._postBackEvent = value; 
    } 

    // This is the client-side event handler where the postback is initiated from 
    _onTimerTick: function(sender, eventArgs) { 
     // The following line evaluates the string var as javascript, 
     // which will cause the desired postback 
     eval(this._postBackEvent); 
    } 
} 

अब सर्वर साइड घटना एक ही संभाला जा सकता है जिस तरह से आप किसी भी अन्य नियंत्रण पर एक घटना संभाल लेंगे।