2008-12-03 10 views
5

मैं एक सूची बॉक्स नियंत्रण होता है:SelectedIndex Postbacks दौरान खो जाता है - ASP.NET

 

<asp:ListBox runat="server" id="lbox" autoPostBack="true" /> 
 

कोड के पीछे जैसा दिखता है:

 

private void Page_Load(object sender, System.EventArgs e) 
{ 
    lbox.SelectedIndexChanged+=new EventHandler(lbox_SelectedIndexChanged); 
    if(!Page.IsPostBack) 
    { 
     LoadData();  
    } 
} 
private LoadData() 
{ 
    lbox.DataSource = foo(); 
    lbox.DataBind(); 
} 
protected void lboxScorecard_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    int index = (sender as ListBox).selectedIndex; 
} 
 

मेरे समस्या यह है कि जब मेरा पेज एक पोस्ट वापस प्राप्त (जब कोई उपयोगकर्ता सूची बॉक्स में चयन करता है), चयन हमेशा सूची बॉक्स में पहले आइटम पर "कूदता है", ताकि मेरे कॉलबैक फ़ंक्शन में इंडेक्स वैरिएबल हमेशा 0

ऐसा लगता है कि यह एक दृश्य हो सकता है समस्या खा ली मैं इसे कैसे ठीक कर सकता हूं ताकि चयन सूचकांक पोस्टबैक के माध्यम से बना रहता है?

कोई AJAX चल रहा है, यह .NET 1.0 है।

धन्यवाद।

संपादित करें 1 जॉनआईडोल ने मुझे एक कदम करीब प्राप्त कर लिया है, अगर मैं डेटा स्रोत को अपने मूल डेटाटेबल से एक ऐरेलिस्ट में स्विच करता हूं, तो सब ठीक से काम करता है ... इसका क्या कारण होगा?

संपादित करें 2 यह पता चला है कि मेरे डेटाटेबल में कई मान थे जो कि समान थे, ताकि इंडेक्स को समान मूल्य वाले सभी आइटमों के समान माना जा सके ... उन लोगों के लिए धन्यवाद जिन्होंने मदद की!

+0

.NET 2.0 पर बिल्कुल वही सामान मेरे लिए ठीक काम करता है – JohnIdol

+0

आपकी समस्या को हल करने में खुशी हुई है – JohnIdol

उत्तर

2

foo() फ़ंक्शन कॉल का आउटपुट क्या है?

मैन्युअल रूप से सूची बॉक्स को पॉप्युलेट करना आप जो भी चाहें इंडेक्स सेट कर सकते हैं (उदाहरण के लिए सभी 0) - तो एक ही चीज किसी दिए गए डेटा को स्थापित कर सकती है स्रोत (कुछ जो इंडेक्स मुझे लगता है) निर्दिष्ट करता है। यदि सभी आइटम इंडेक्स 0 हैं तो नतीजा यह है कि चयनित इंडेक्स चेंज इवेंट नहीं उठाया गया है (इंडेक्स नहीं बदलेगा!) और सब कुछ गड़बड़ हो गया है: पोस्ट-बैक चयन पर सूची में पहले आइटम पर वापस जाया जाएगा।

यह समझाएगा - मैं किसी और चीज के बारे में नहीं सोच सकता - यह मेरे लिए .NET 2.0 पर ठीक काम कर रहा है। मैं सूची बॉक्स को पॉप्युलेट करने के लिए तारों के साथ एक ऐरेलिस्ट का उपयोग कर रहा हूं।

एकमात्र तरीका मैं आपकी समस्या को पुन: उत्पन्न कर सकता हूं, सभी इंडेक्स 0 पर सेट कर रहा है।

मैं कहूंगा कि सूची बॉक्स में एक घड़ी जोड़ें और यह सुनिश्चित करने के लिए इंडेक्स को रनटाइम पर जांचें कि वे सभी शून्य नहीं हैं।

+0

मैं डेटा तालिका के साथ डेटा बाध्यकारी हूं ... यह वास्तव में मेरे दिमाग को उड़ाना शुरू कर रहा है ... मैंने निश्चित रूप से सोचा कि यह ठीक करने के लिए एक आसान बात थी ... – mmattax

+0

एक सरणी सूची के साथ प्रयास करें और देखें कि जिज्ञासा से क्या होता है। सुनिश्चित करें कि डेटाटेबल में केवल एक कॉलम है – JohnIdol

+0

मैंने अभी एक सरणी सूची की कोशिश की है, यह काम करता है ... अब मुझे बस यह पता लगाने की ज़रूरत है कि मेरे डेटाटेबल के साथ क्या गलत है ... हालांकि यह एक डीबी क्वेरी से आता है ... कोई विचार? – mmattax

-2

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

<asp:ListBox runat="server" id="lbox" autoPostBack="true" OnSelectedIndexChanged="lboxScorecard_SelectedIndexChanged" /> 

उसके अलावा, मैं यह सत्यापित होता है कि ViewState सक्षम है। व्यूस्टेट नियंत्रण, पृष्ठ, & साइट स्तर पर भी चालू किया जा सकता है।

0

ऐसा लगता है कि आप प्रत्येक पृष्ठ लोड पर एक नया ईवेंटधारक बना रहे हैं। यह समस्या पैदा कर सकता है। क्यों eventhandler एलान के तौर पर संलग्न नहीं:

<asp:ListBox runat="server" id="lbox" autoPostBack="true" OnSelectedIndexChanged="lbox_SelectedIndexChanged" /> 

भी, क्यों सीधे नियंत्रण संदर्भ, कास्टिंग के बजाय नहीं?

protected void lbox_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    int index = lbox.selectedIndex; 
} 
+0

मैं कास्टिंग कर रहा हूं क्योंकि .NET 1.0 के साथ, आपको कोड को पीछे कोड में एक आवृत्ति चर के रूप में रखना होगा। नेट 2.0 + नियंत्रण आवृत्ति चर के बिना सुलभ है। – mmattax

+0

ईवेंट श्रोता को जोड़ने से मेरी समस्या हल नहीं हुई ... – mmattax

+0

दरअसल, मैंने प्रत्येक बार इवेंट हैंडलर बनाने के लिए कोड निकाला और चीजें अब काम कर रही हैं। अब, मुझे वास्तव में आश्चर्य है कि ये लोग कौन हैं जो हर समय मतदान सामग्री को कम करते हैं? मैं उस तरह से बीमार हूं - यह पहली बार नहीं है कि मैंने केवल एक कम वोट वाला समाधान इस्तेमाल किया है, यह पता लगाने के लिए कि यह सबसे अच्छा जवाब है। –

-1

क्या आपने पहले डेटा लोड करने के बारे में सोचा है - उदा। पृष्ठ/उपयोगकर्ता नियंत्रण पर OnInit घटना में। पोस्टबैक डेटा लोड होने से पहले ऐसा होता है और इस तरह एक बदलाव से पहले संसाधित किया जा सकता है? मेरा मानना ​​है कि काम करना चाहिए - लेकिन आप व्यूस्टेट को बंद करना चाहते हैं!

0

मेरे लिए भी काम करता है। क्या आपका foo() हर बार समान मान देता है?

बस एक साइड नोट के रूप में: यदि संभव हो, तो आपको वास्तव में ऑनइनिट में अपना डाटाबेसिंग करना चाहिए (हर बार, केवल जीईटी पर नहीं)। यदि आप आधार पर कॉल करने से पहले ऐसा करते हैं। ऑनइन (...), आपके लिस्टबॉक्स की सामग्री को धारावाहिक और व्युत्पन्न करने की आवश्यकता नहीं होगी और तार से क्लाइंट को भेजा जाएगा (हाँ, आप मार रहे होंगे डेटाबेस अधिक है, लेकिन आप एक ऐसे सिस्टम को मार देंगे जो आपके स्थानीय सबनेट पर स्थित है, या यहां तक ​​कि उसी मशीन पर भी। इसके अलावा, डेटाबेस परिणाम को कैश करेगा)।

यदि आप उच्च-प्रदर्शन वाली वेबसाइटें बनाना चाहते हैं, तो आपको व्यूस्टेट का उपयोग करने के तरीके पर नज़र डालने की आवश्यकता है। मैं अत्यधिक इस आलेख की अनुशंसा करता हूं: TRULY Understanding ViewState

+0

मेरा कोड डू वास्तव में मेरे उदाहरण के रूप में डेटाबेस को निष्पादित नहीं करता है, मैं वास्तव में एक बटन क्लिक पर डेटाबेसिंग कर रहा हूं ... – mmattax

+0

क्या आपने समस्या का समाधान किया है? यदि हां, तो समाधान क्या था? – Rune

+0

ओह, कभी भी ध्यान न दें, मुझे लगता है कि आप पहले ही समाधान पोस्ट कर चुके हैं :-) – Rune

1

डाटाबेसिंग ड्रॉपडाउनलिस्ट/लिस्टबॉक्स दर्दनाक है, क्योंकि वे अक्सर गलत मानों से जुड़ते हैं।

मैं DataBind() का उपयोग करने पर छोड़ दिया गया है, और सिर्फ एक foreach पाश का उपयोग कर का सहारा:

foreach (Item i in DataSet) 
{ 
    listBox.Items.Add(etc); 
} 
10

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

+0

बहुत अच्छी सलाह! मैंने हमेशा सोचा है कि व्यूस्टेट अक्षम होने के साथ ऐसा करने के लिए कुछ विचलन था, लेकिन यहां तक ​​कि व्यूस्टेट अक्षम होने के साथ ही मेरी ड्रॉपडाउन सूची ठीक काम करती है जब मैं अपने बाध्यकारी कोड को इनिट में ले जाता हूं –

1

पेज_लोड के बजाय पेज_इनिट में डेटा लोड करें। पोस्टबैक में उपलब्ध होने के लिए पेज_इनिट के दौरान डेटा भरना होगा।

2

यदि आपकी सूची बॉक्स आइटम समान हैं तो चयनित इंडेक्स 0 पर सेट हो जाएगा। इसे सुधारने के लिए, item.value पर अलग-अलग मान सेट करें और item.text समान रहें .. फिर चयनित इंडेक्स ठीक से प्रदर्शित होगा।

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