2010-08-11 10 views
25

अनचेक मैं बहुत की तरह एक ASP.NET सामग्री फार्म पर एक चेकबॉक्स है:ASP.NET चेक बॉक्स CheckedChanged ईवेंट सक्रिय नहीं है जब

protected void chkTest_CheckedChanged(object sender, EventArgs e) 
{ 
} 
:

<asp:CheckBox runat="server" ID="chkTest" AutoPostBack="true" OnCheckedChanged="chkTest_CheckedChanged" /> 

मेरी कोड में पीछे मैं निम्न विधि है

जब मैं ब्राउज़र में पृष्ठ लोड करता हूं और चेकबॉक्स पर क्लिक करता है, तो यह पृष्ठ पोस्ट हो जाता है, और मैं chkTest_CheckedChanged कहलाता हूं।

जब मैं फिर चेकबॉक्स पर क्लिक करता हूं तो यह अनचेक हो जाता है, पेज पोस्ट वापस होता है, हालांकि chkTest_CheckedChanged नहीं कहा जाता है।

प्रक्रिया दोहराने योग्य है, इसलिए चेकबॉक्स अनचेक होने के बाद, यह जांचने से ईवेंट को आग लग जाएगी।

मेरे पास वेब में दृश्य राज्य अक्षम है। कॉनफिग, दृश्य स्थिति को सक्षम करने से इस समस्या को गायब हो जाता है। व्यू स्टेटस अक्षम होने पर विश्वसनीय घटना फायरिंग के लिए मैं क्या कर सकता हूं?

अद्यतन: अगर मैं सर्वर टैग पर Checked="true" सेट स्थिति घटना जब चेकबॉक्स का चयन हटा जाँच फायरिंग के साथ उलट हो जाता है, लेकिन चारों ओर नहीं अन्य तरीके से।

अद्यतन 2: मैं अपने पृष्ठ में OnLoadComplete अधिरोहित है और वहाँ के भीतर से मैं पुष्टि कर सकता Request.Form["__EVENTTARGET"] मेरी चेकबॉक्स के आईडी को ठीक से सेट है।

+2

जो मेरे साथ भी होता है, ऐसा क्यों होता है? कोई जानकारी? इस सुरंग के अंत में कोई प्रकाश (जो मुझे दौड़ने वाला नहीं है)? – Ayyash

+0

यह आपकी सहायता करेगा यदि आप अपने पेज_लोड ईवेंट का कोड पोस्ट कर सकते हैं – Waqas

+0

पेज_लोड ईवेंट में कुछ भी नहीं है। सभी कोड मूल पोस्ट में है। – Matt

उत्तर

17

कि ControlState बजाय ViewState में Checked संपत्ति संग्रहीत करता है एक कस्टम चेक बॉक्स को लागू शायद उस समस्या का समाधान होगा, चेक बॉक्स AutoPostBack=false

ViewState के विपरीत है, भले ही, ControlState निष्क्रिय नहीं किया जा सकता है और डाटा को करने के लिए इस्तेमाल किया जा सकता है कि नियंत्रण के व्यवहार के लिए आवश्यक है।

मैं परीक्षण करने के लिए अभी एक दृश्य स्टूडियो environnement की जरूरत नहीं है, लेकिन यह चाहिए इस तरह दिखता है:

public class MyCheckBox : CheckBox 
{ 
    private bool _checked; 

    public override bool Checked { get { return _checked; } set { _checked = value; } } 

    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 
     //You must tell the page that you use ControlState. 
     Page.RegisterRequiresControlState(this); 
    } 

    protected override object SaveControlState() 
    { 
     //You save the base's control state, and add your property. 
     object obj = base.SaveControlState(); 

     return new Pair (obj, _checked); 
    } 

    protected override void LoadControlState(object state) 
    { 
     if (state != null) 
     { 
      //Take the property back. 
      Pair p = state as Pair; 
      if (p != null) 
      { 
       base.LoadControlState(p.First); 
       _checked = (bool)p.Second; 
      } 
      else 
      { 
       base.LoadControlState(state); 
      } 
     } 
    } 
} 

अधिक जानकारी here

+0

यह मेरे लिए काम नहीं किया। मैट समाधान bellow – Marcin

+0

धन्यवाद यह जादू की तरह काम करता है। मैं हर समय विश्वास नहीं कर सकता कि मैं काम कर रहा हूं। नेट अब तक इस मुद्दे में कभी नहीं चला है। यह गतिशील रूप से बनाए गए चेकबॉक्स पर भी काम करता है, बस मानक लोगों की बजाय उन्हें "माईचेकबॉक्स" उदाहरण के रूप में पंजीकृत करें और आपके जाने के लिए अच्छा है। – pharophy

+0

बिग अप - धन्यवाद। चेकबॉक्स उन बॉक्स के बाहर क्यों काम नहीं कर सकता जो मुझे नहीं पता। –

7

यह आग नहीं है क्योंकि व्यूस्टेट अक्षम होने के साथ सर्वर कोड को पता नहीं है कि चेकबॉक्स पहले चेक किया गया था, इसलिए यह नहीं पता कि राज्य बदल गया है। जहां तक ​​asp.net जानता है कि चेकबॉक्स नियंत्रण को पोस्टबैक से पहले अनचेक किया गया था और अभी भी अनचेक किया गया है। Checked="true" सेट करते समय यह आपके द्वारा देखे गए रिवर्स व्यवहार को भी समझाता है।

+0

मैं एक साल बाद इस पर वापस आ रहा हूं, इसलिए मुझे याद नहीं है कि मेरे विचार वापस क्या थे, लेकिन आप सही हैं, पृष्ठ जीवन चक्र इस प्रभाव का कारण बनता है। मुझे लगता है कि संभवतः मैं उम्मीद कर रहा था क्योंकि __EVENTTARGET को मेरे चेकबॉक्स पर सेट किया गया था कि एएसपी.नेट शायद यह समझने के लिए चालाक हो सकता है कि यह बदल गया है। – Matt

1

मैं चीजों को थोड़ा सा साफ करना चाहता था इसलिए मैंने इसके लिए एक समाधान का परीक्षण करने में थोडा समय बिताया है।

जोशब अपने स्पष्टीकरण के साथ सही है कि चेकबॉक्स किस तरह से व्यवहार करता है।

जैसा कि मुझे नहीं पता कि मैं पिछले साल इस दौर में कैसे पहुंचा था या यहां तक ​​कि अगर मैंने किया (मुझे याद नहीं है कि मैं जांच करने के समय क्या काम कर रहा था), मैंने एक सरल समाधान/कामकाज एक साथ रखा है ।

public class CheckBox2 : CheckBox 
{ 
    protected override bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection) 
    { 
     bool isEventTarget = postCollection["__EVENTTARGET"] == UniqueID; 
     bool hasChanged = base.LoadPostData(postDataKey, postCollection); 
     hasChanged = hasChanged || isEventTarget; 
     return hasChanged; 
    } 
} 

अब आप अपने पेज में CheckBox2 रजिस्टर और अपने मानक चेक बॉक्स के स्थान पर इसका इस्तेमाल करते हैं, तो आप CheckedChanged गतिविधि सक्रिय आप ViewState विकलांग और AutoPostBack सक्षम के साथ की उम्मीद के रूप में मिल जाएगा।

इस तरह से यह काम करता है कि सामान्य चेकबॉक्स अपने सत्यापन को सत्यापन और परिवर्तन के साथ करने की अनुमति दे रहा है, लेकिन फिर यह देखने के लिए एक अतिरिक्त जांच करता है कि यह पोस्टबैक के कारण होने वाले ईवेंट का लक्ष्य था या नहीं। यदि यह लक्ष्य था, तो चेक किए गए चेंज किए गए ईवेंट को बढ़ाने के लिए ढांचे को बताने के लिए यह सच हो जाता है।

संपादित करें: कृपया ध्यान दें कि यह केवल चेकबॉक्स पर ऑटोपोस्टबैक के लिए समस्या हल करता है। यदि पोस्टबैक किसी और चीज से लिया जाता है (उदाहरण के लिए एक बटन), चेक किए गए चेंजेड ईवेंट अभी भी देखी गई समस्या को प्रदर्शित करता है।

+0

जब लोडपोस्टडाटा कॉल नहीं कर रहा है, तो यह सहायक हो सकता है http://stackoverflow.com/questions/3211200/asp-net-custom-control-when-is-loadpostdata-called – sll

6

मुझे यकीन है कि नहीं कर रहा हूँ, लेकिन मुझे लगता है कि है कि मेरे समाधान .NET फ्रेमवर्क 4.0 के लिए केवल काम कर रहा है:

उपयोग ViewStateMode = "Disabled" दृश्य राज्य EnableViewState="false" के insted निष्क्रिय करने के लिए। यह एक ही व्यवहार को सावधानी बरतता है सिवाय इसके कि आप स्थानीय दृश्य स्थिति को बचा सकते हैं।

तो, अपने चेकबॉक्स पर, विशेषता ViewStateMode = "Enabled" पर सेट करें और समस्या को हल किया गया है, बिना किसी कस्टम चेकबॉक्स को लागू किए।

14

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

AutoPostBack="true" Checked="false" 
0

मुझे एक ही समस्या थी। मैंने इस पर बहुत समय बिताया है और आखिरकार इसे हल कर लिया है।

मेरे मामले Checkbox में डिफ़ॉल्ट रूप से अक्षम किया गया था:

<asp:CheckBox ID="chkActive" runat="server" Enabled="false"/> 

यह बदल जाता है ViewState विकलांग या अदृश्य नियंत्रण के लिए लोड नहीं है। तो Enabled="false" या Visible="false" हटाएं और यह expeceted के रूप में काम करेगा। और निश्चित रूप से ViewState अक्षम नहीं किया जाना चाहिए।

6

यह एक पुरानी पोस्ट है लेकिन मुझे इस समस्या की खोज करने वाले अन्य लोगों की सहायता के लिए अपना सरल समाधान साझा करना पड़ा।

समाधान सरल है: ऑटोपोस्टबैक चालू करें।

 <asp:CheckBox id="checkbox1" runat="server" 
       AutoPostBack="True" //<<<<------ 
       Text="checkbox" 
       OnCheckedChanged="knowJobCBOX_CheckedChanged"/> 
0

इसके अतिरिक्त: JavaScript कंसोल में किसी भी त्रुटि के लिए चेक।

मुझे ओपी द्वारा वर्णित वही सटीक समस्या का अनुभव हुआ, सिवाय इसके कि यह केवल सफारी में हुआ (checkbox क्रोम और फ़ायरफ़ॉक्स में ठीक काम किया)। जावास्क्रिप्ट कंसोल का निरीक्षण करने पर, मुझे एक त्रुटि मिली जो एक विकृत jQuery चयनकर्ता द्वारा फेंक दिया गया था।

मेरे मामले में, मेरे पास $('a[id*=lbView') था जो ] को बंद कर रहा था। इसने सफारी में एक त्रुटि फेंक दी लेकिन आश्चर्यजनक रूप से, क्रोम में और न ही फ़ायरफ़ॉक्स में।

-1

सुपर आसान जवाब ViewState को उस नियंत्रण के लिए सेट करना है।

चेकबॉक्स टैग में AutoPostBack="true" संपत्ति में EnableViewState="true" जोड़ें।

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