6

पर मैंने TRULLY Understanding ViewState (महान आलेख बीटीडब्लू) लेख का पालन किया और मेरी ड्रॉप डाउन सूची पॉप्युलेट करना बहुत अच्छा काम कर रहा है। मैंने एक ऑन-सिलेक्टेड इंडेक्स चेंज इवेंट भी स्थापित किया है जो लगभग उतना ही बढ़िया है।ड्रॉपडाउनलिस्ट ऑनस्टेलेटेड इंडेक्स 0 वें इंडेक्स w/आउट व्यूस्टेट

मुझे मिली समस्या यह है कि चयनित इंडेक्स चेंजेड ईवेंट 0 वें इंडेक्स का चयन करते समय आग नहीं लगेगा। हालांकि यह अन्य सभी बार करता है।

<asp:DropDownList runat="server" ID="DropDownList1" EnableViewState="false" 
AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" /> 


protected override void OnInit(EventArgs e) 
{ 
    this.DropDownList1.DataTextField = "Text"; 
    this.DropDownList1.DataValueField = "Value"; 
    this.DropDownList1.DataSource = fillQueueDropDown(); 
    this.DropDownList1.DataBind(); 

    base.OnInit(e); 
} 

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    OnSelectedQueueChanged(e); 
} 

public void OnSelectedQueueChanged(EventArgs e) 
    { 
     // Do stuff. 
    } 

public event EventHandler queueNamesChangedEvent; 
public void OnSelectedQueueChanged(EventArgs e) 
    { 
     if (queueNamesChangedEvent != null) 
      queueNamesChangedEvent(this, e); 
    } 

मैं मैं Page_Load विधि में की जांच कुछ प्रकार कर सकते हैं लगता है:

यहाँ कुछ कोड है

if(ViewState["selectedIndexChangedFlag"] != 1) 
     // raise OnSelectedChange event 

या वहाँ कुछ मैं कर सकता है OnInit() विधि में सेटअप जहां मैं हर बार इस डेटा को पुनर्निर्मित कर रहा हूं कि मैं कर सकता हूं?

देखें, मेरा कस्टम इवेंट हैडर एक ऐसा ईवेंट उठाता है जो एक अभिभावक पृष्ठ द्वारा पकड़ा जाता है जिसमें यह नियंत्रण रहता है, ताकि माता-पिता नए चुने हुए मूल्य का उपयोग करके कुछ कार्रवाई कर सकें। और यह वर्तमान में सभी मामलों के लिए काम कर रहा है जहां चयनित इंडेक्स> 0.

मैं इस नियंत्रण में एक संपत्ति बनाता हूं जिसमें सबसे हाल ही में चयनित इंडेक्स है, इस मामले में मेरा मूल पृष्ठ प्रत्येक पृष्ठ_लोड पर इस संपत्ति मूल्य पर कार्रवाई कर सकता है। .. डुनो

सुझावों के लिए खोलें। या इस चयनित इंडेक्स चेंजेड ईवेंट को उस 0 वें इंडेक्स चयन के लिए आग लगाने के लिए कैसे मजबूर करें।

उत्तर

5

इस ड्रॉप डाउन सूची पर व्यूस्टेट को अक्षम करने के साथ मेरा लक्ष्य पृष्ठ के लिए व्यूस्टेट के आकार को कम करना है।

समस्या केवल मेरे पास थी (! पेज.इस्पोस्टबैक) {... डेटाबिंड() ...}, यह है कि जब आप पहली बार कोई आइटम चुनते हैं, और पृष्ठ पुनः लोड होता है, तो मेरी बूंद नीचे सूची खाली हो जाती है।

मैं जो कर रहा हूं वह इस नियंत्रण पर एक और संपत्ति बना रहा था, LastIndex। जब OnSelectedIndexChanged ईवेंट आग लगती है, तो मैं LastIndex मान को अद्यतन करता हूं। पेज_लोड में, मैं वर्तमान और अंतिम इंडेक्स मानों की तुलना करता हूं, यदि वे अलग हैं, तो एक इंडेक्स बदली गई घटना को आग लगाना।

public int SelectedValue{ 
     get { return this.DropDownList1.SelectedItem.Value; } 
    } 

    public int LastIndex{ 
     get { return this.ViewState["lastIndex"] == null ? -1 : (int)this.ViewState["lastIndex"]; } 
     set { this.ViewState["lastIndex"] = value; } 
    } 

    protected override void OnInit(EventArgs e){ 
     base.OnInit(e); 
     this.DropDownList1.DataTextField = "Text"; 
     this.DropDownList1.DataValueField = "Value"; 
     this.DropDownList1.DataSource = fillQueueDropDown(); 
     this.DropDownList1.DataBind(); 
    } 

    protected void Page_Load(object sender, EventArgs e){ 
     if (this.LastIndex != this.SelectedValue) 
      this.OnSelectedQueueChanged(new EventArgs()); 
    } 

    private ListItemCollection fillQueueDropDown(){...} 

    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e){ 
     OnSelectedQueueChanged(e); 
     this.LastIndex = this.SelectedValue; 
    } 

    public event EventHandler queueNamesChangedEvent; 
    public void OnSelectedQueueChanged(EventArgs e){ 
     if (queueNamesChangedEvent != null) 
      queueNamesChangedEvent(this, e); 
    } 

हालांकि आप सही हैं। डेटा को फिर से लोड किया जाता है और ऑनइनिट चरण में फिर से बाध्य किया जाता है। फिर व्यूस्टेट को पुनर्स्थापित किया जाता है (और जब 0 वें इंडेक्स को पुनर्स्थापित किया जाता है), जब हम अंततः घटनाक्रम चरण में जाते हैं, तो नियंत्रण में परिवर्तन का पता नहीं लगाया जाता है।

सुनिश्चित नहीं है कि यह सबसे सुंदर मार्ग है, लेकिन यह अब तक अच्छा काम कर रहा है।

तब मैं IPostBackDataHandler के लिए MSDN डॉक्स में इस पाया:

public virtual bool LoadPostData(string postDataKey, 
    NameValueCollection postCollection) { 

    String presentValue = Text; 
    String postedValue = postCollection[postDataKey]; 

    if (presentValue == null || !presentValue.Equals(postedValue)) { 
     Text = postedValue; 
     return true; 
    } 

    return false; 
    } 

के बाद से वर्तमान मूल्य के रूप में बदल करने के लिए मूल्य, गतिविधि सक्रिय नहीं है एक ही है।

+1

+1 बहुत अच्छा - यह व्यूस्टेट के बिना इसे करने का एक शानदार तरीका है! क्षमा करें मुझे नहीं पता था कि आप व्यूस्टेट नहीं चाहते थे - मैं अगली बार प्रश्न को और सावधानी से पढ़ूंगा। –

+1

आपके प्रारंभिक समाधान के लिए धन्यवाद, यह वास्तव में चीजों के क्रम में कुछ प्रकाश डालने में मदद करता है। मुझे लगता है कि मुझे एएसपीनेट पेज लाइफ चक्र के साथ-साथ मैंने सोचा नहीं है। –

8

समस्या यह है कि आप प्रत्येक बार डेटा लोड कर रहे हैं और यह चयनित अनुक्रमणिका को रीसेट कर रहा है। कल्पना कीजिए कि यह आपके लटकती है:

zero 
one [selected] 
two 

यह अपने नए सूचकांक के साथ छिपे हुए इनपुट __EVENTARGUMENT भरता है (1) और के साथ छिपे हुए इनपुट __EVENTTARGET:

zero [selected] 
one 
two 

तो ग्राहक में आपके द्वारा चयनित सूचकांक बदल आपके ड्रॉपडाउन के id। अब सर्वर-साइड कोड में लात मारता है और अपने डेटा पुन: लोड: क्योंकि कि डिफ़ॉल्ट जब डेटा लोड किया जाता है है

zero [selected] 
one 
two 

"शून्य" चयनित मूल्य है। फिर एएसपी.नेट __EVENTTARGET और __EVENTARGUMENTRequest में देखता है और आपके ड्रॉपडाउन के id को पाता है और नई अनुक्रमणिका (1) पाता है। अब आप अपने लटकती इस तरह दिखता है:

zero 
one [selected] 
two 

के बाद से सूचकांक बदल गया है, यह दर्शाता है कि लटकती सूचकांक बदल गया है इसके SelectedIndexChanged घटना उठाती है। जाहिर है यह वह हिस्सा है जो काम कर रहा है, अब देखते हैं कि सूची में पहला आइटम चुनने से ईवेंट क्यों नहीं बढ़ता है।

अब कहें कि हमारे पास अभी भी राज्य में गिरावट है (केवल "एक" चुना जा रहा है और 1 का चयनित सूचकांक)। क्या होता है जब हम ग्राहक पर सूची में पहला आइटम चुनते हैं?

__EVENTTARGET और __EVENTARGUMENT ड्रॉपडाउन के id और नई अनुक्रमणिका (0) के साथ आबादी वाले हैं। फिर सर्वर लटकती में डेटा लोड करता है और लटकती अब फिर से इस तरह दिखता है:

zero [selected] 
one 
two 

सूचना है कि जब से तुम डेटा पुनः लोड से पहले घटनाओं निकाल दिया सूचकांक पहले से ही 0 पर सेट है, क्योंकि है कि डिफ़ॉल्ट है । अब जब आपकी घटना आग लगती है और ड्रॉपडाउन की चयनित इंडेक्स 0 पर सेट हो जाती है, तो ड्रॉपडाउन इसे चयनित इंडेक्स (जहां तक ​​यह जानता है) के बाद से बदलाव के रूप में नहीं दिखता है।

यहाँ कैसे इस समस्या को ठीक करने के लिए है:

protected override void OnLoad(EventArgs e) 
{ 
    base.OnLoad(e); 

    if (!Page.IsPostBack) 
    { 
     this.DropDownList1.DataTextField = "Text"; 
     this.DropDownList1.DataValueField = "Value"; 
     this.DropDownList1.DataSource = fillQueueDropDown(); 
     this.DropDownList1.DataBind(); 
    }  
} 

क्या होगा अगर पेज एक पोस्टबैक नहीं है यह कर देगा केवल लटकती में डेटा लोड कर रहा है। इसका अर्थ यह है कि व्यूस्टेट आपके लिए डेटा के साथ-साथ चयनित इंडेक्स को बनाए रखेगा ताकि जब आप ड्रॉपडाउन वापस पोस्ट करेंगे तो नई इंडेक्स की तुलना क्लाइंट में देखी गई इंडेक्स से की जाएगी।

+0

एक बहुत अच्छी व्याख्या! –