2011-01-13 19 views
6

मेरे पास एक सूची बॉक्स है जिसे मैं Listbehind में ListItems जोड़ रहा हूं। मेरी समस्या यह है कि ListBox चयनित आइटम नहीं देख रहा है। मेरे पास ड्रॉपडाउनलिस्ट से उपयोगकर्ता का चयन करने के आधार पर सूची बॉक्स को गतिशील रूप से पॉप्युलेट किया जा रहा है, इसलिए ड्रॉपडाउनलिस्ट में ऑटोपोस्टबैक सत्य पर सेट है। मुझे लगता है कि यह किसी भी तरह से समस्या पैदा कर रहा है।ListBox चयनित आइटम नहीं मिल रहे हैं

मेरा SelectedIndexChanged विधि, जिसका उपयोग तब भी किया जाता है जब ड्रॉपडाउनलिस्ट में कोई आइटम चुना जाता है, PopulateListBox नामक विधि को कॉल करता है।

<asp:DropDownList runat="server" ID="type" width="281px" OnSelectedIndexChanged="SelectedIndexChanged" AutoPostBack="true" /> 

<asp:ListBox runat="server" ID="listbox" width="281px" height="200px" selectionmode="Multiple" /> 

मुझे क्या करना कोशिश कर रहा हूँ (तार की सूची जोड़ने के तार चयनित किया जा रहा है:

protected void SelectedIndexChanged(object sender, EventArgs e) 
{ 
    string typeStr = type.SelectedItem.Text; 
    MyType = Api.GetType(typeStr); 
    PopulateListBox(); 
} 

private void PopulateListBox() 
{ 
    listbox.Items.Clear(); 
    foreach (PropertyInfo info in MyType.GetProperties()) 
     listbox.Items.Add(new ListItem(info.Name)); 
} 

क्या इसके लायक है के लिए, यहाँ DropDownList और ListBox हैं: यहाँ उन तरीकों लग रहा है की तरह है आइटम) सबमिट बटन पर क्लिक करने पर एक सत्र चर के रूप में। सत्र में सूची जोड़ने के बाद बटन एक नए पृष्ठ पर रीडायरेक्ट करता है। डीबगर में जाकर, स्ट्रिंग्स की सूची उस बिंदु पर खाली है जहां मैं इसे सत्र में जोड़ता हूं।

listbox.GetSelectedIndices() कुछ भी नहीं देता है।

अद्यतन

मैं चयनित आइटम का उपयोग करता है, तो मैं DropDownList में बदलाव नहीं बनाते हैं कर सकते हैं। सूची बॉक्स प्रारंभ में पृष्ठ लोड पर आबादी है, और यदि मैं चयन करता हूं तो उन्हें पहचाना जाता है। अगर मैं ड्रॉपडाउनलिस्ट से कुछ चुनता हूं और लिस्टबॉक्स को दोहराया जाता है, तो चयनों को पहचाना नहीं जाता है।

मेरा Page_Load विधि केवल दो चीजें करता है। यह मेरी एपीआई चर initializes और PopulateDropDown कहता है, जो इस प्रकार है:

private void PopulateDropDown() 
{ 
    foreach (Type t in Api.GetAllTypes()) 
     type.Items.Add(new ListItem(t.Name)); 
    string typeStr = type.Items[0].Text; 
    Type = Api.GetType(typeStr); 
    PopulateListBox(); 
} 
+0

लेकिन जब आप सूची बॉक्स में चयनित आइटम नहीं देख सकते हैं? ड्रॉपडाउन सूची में चयन बदलते समय? या आपके पास कुछ अन्य नियंत्रण पोस्टबैक कर रहा है? – dzendras

+0

@dzendras: मैंने इस संबंध में नीचे पोस्ट को अपडेट किया है। –

+0

आप सूची बॉक्स तक कब पहुंचते हैं? Pageload? जांचें कि जिस स्थान पर आप इसे एक्सेस करते हैं, वह एएसपी.नेट पृष्ठ जीवन चक्र के अनुसार ठीक है (प्रसंस्करण अनुरोध नियंत्रण के शुरुआती चरणों में उनके गुण सेट नहीं होते हैं)। यह भी जांचें कि क्या आप पृष्ठ जीवन चक्र में पहले सूची बॉक्स को साफ़ नहीं कर रहे हैं। – dzendras

उत्तर

13

समस्या यह है कि आप हर एक Page_Load(), जो PopulateListBox(), जो लिस्टबॉक्स को साफ करता है और यह repopulates कॉल पर PopulateDropDown() कहते हैं। सूची बॉक्स को साफ़ करके, आप चयन को साफ़ करते हैं।

आपको निम्नलिखित कोड के साथ Page_Load() में अपनी कॉल को PopulateDropDown() पर प्रतिस्थापित करने की आवश्यकता है। मुद्दा जो मुझे लगता है कि आपको एहसास नहीं है कि पृष्ठ प्रत्येक पोस्टबैक पर लोड किया गया है - और पृष्ठ जीवन चक्र में, पृष्ठ लोड घटना से पहले होता है। तो ड्रॉप डाउन आइटम का चयन करके, आप Page_Load() ईवेंट पहले निष्पादित करें (जो चयन को समाशोधन, लोडलिस्ट बॉक्स विधि को अप्रत्यक्ष रूप से निष्पादित करता है)। निम्न कोड ड्रॉप डाउन सूची को पहली बार लोड करेगा जब पेज केवल लोड करता है।

protected void Page_Load(object sender, EventArgs e) 
{ 
    // Do your API code here unless you want it to occur only the first 
    // time the page loads, in which case put it in the IF statement below. 
    if (!IsPostBack) 
    { 
     PopulateDropDown(); 
    } 
} 

IsPostBack एक बूलियन यह बताते हैं कि सर्वर साइड कोड क्योंकि पेज पहली बार ("गलत") के लिए लोड कर रहा है चल रहा है देता है या के रूप में: यह एक ही किसी और जहाँ भी आप लोड लटकती विधि का उपयोग कर रहे हैं रखो एक पोस्ट बैक ("सच")।

जैसा कि मैंने कहीं और कहा था, ध्यान रखें कि एकाधिक चयनित मानों के लिए संभावित वाले एक सूची बॉक्स को एक चयन के लिए संभावित रूप से एक से अलग किया जाना चाहिए।listbox.SelectedItem संदर्भ मत करो, बल्कि:

foreach (ListItem item in lbFullNames) 
{ 
    if (item.Selected) 
    { 
     // TODO: Whatever you are doing with a selected item. 
    } 
} 
+0

आह, धन्यवाद जस्टिन। DropDownList केवल एक पोस्टबैक कॉल करता है क्योंकि ऑटोपोस्टबैक इसके लिए सत्य पर सेट है, है ना? मैं कल आपका समाधान एक शॉट दूंगा और रिपोर्ट करूंगा। –

+0

हाँ, पर यदि आप गलत पर AutoPostBack सेट तो सी # कोड निष्पादित नहीं होगा जब आप अनुक्रमणिका बदलने के लिए, जिसका अर्थ है लिस्टबॉक्स फिर से आबाद नहीं होंगे। –

1

मैंने यह भी पाया है कि यदि आप ListBox सर्वर साइड अक्षम करें, तो निम्न की तरह कोड का उपयोग कर सूची बॉक्स सक्षम करने के लिए ग्राहक के पक्ष कोड का उपयोग करें, तो आप नहीं मिल सकता है चयनित आइटम सर्वर पक्ष।

$('.css-class-assigned-to-listbox').attr('disabled', ''); 

ठीक यकीन है कि यह सक्षम किया गया है सर्वर साइड (डिफ़ॉल्ट) बनाने के लिए है, तो उसे निष्क्रिय (झटका देखें) या सक्षम यह (ऊपर देखें) क्लाइंट-साइड कोड का उपयोग कर बस है।

$('.css-class-assigned-to-listbox').attr('disabled', 'disabled'); 
संबंधित मुद्दे