2009-05-25 21 views
19

मैं अपने सी # 2.0 विंडोज़ फॉर्म एप्लिकेशन में एक सूची बॉक्स का उपयोग कर रहा हूं। जब यह विधि यह भी लिस्टबॉक्स SelectedIndexChanged का ईवेंट हैंडलर कॉल भले ही मैंने उपरोक्त विधि में चयनित सूचकांक की स्थापना नहीं कर रहा हूँ कार्यान्वित सूची बॉक्स पॉप्युलेट करने के लिए विधि,ListBox.SelectedIndexChanged ईवेंट को कैसे रोकें?

private void PopulateListBox(ListBox lb, ReportColumnList reportColumnList) 
    { 
     lb.DataSource = reportColumnList.ReportColumns; 
     lb.DisplayMember = "ColumnName"; 
     lb.ValueMember = "ColumnName"; 
    } 

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

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

एक और नोट पर, यदि उपयोगकर्ता सूची बॉक्स में खाली क्षेत्र पर क्लिक करता है तो चयनित इंडेक्स चेंजेड ईवेंट निकाल दिया जाता है। तो मैं सोच रहा हूं कि माउसक्लिक घटना से यह कितना अलग है?

+1

अधिकांश भाग के लिए, आप एक घटना को ऊपर उठाने से एक वस्तु नहीं रोका जा सकता .. आप केवल करने के लिए चुन सकते हैं घटना अधिसूचनाओं को सुनना बंद करो। – Gishu

+0

मेरा मतलब था कि अगर मैं किसी भी तरह से अपने कोड के उस हिस्से को रोक सकता हूं, जो घटना को फायर करता है। लेकिन जैसा कि हम देख सकते हैं कि कुछ भी नहीं है क्योंकि मैं PopulateListBox() में सभी तीन पंक्तियों reqd :) –

उत्तर

15

आप() लिस्टबॉक्स के बजाय डेटा स्रोत की स्थापना lb.Items.AddRange का उपयोग कर पॉप्युलेट कर सकते हैं। चयनित इंडेक्स चेंजिंग को ट्रिगर करने के अलावा, यह पहले आइटम को प्री-सिलेक्ट नहीं करेगा। नीचे स्निपेट के आसपास काम कर सकते हैं सुझाव एक कोड:

lb.Items.Clear(); 
lb.Items.AddRange(reportColumnList.ReportColumns.ToArray()); 
+1

हाँ के लिए +1 हाँ ... वही है जो मैं चाहता था। मैंने आपके जवाब के अनुसार अपना कोड बदल दिया और यह एक आकर्षण की तरह काम करता है :) धन्यवाद एक लाख, किम !!! –

18

इस बारे में तीन तरीके हैं जिनसे आप जा सकते हैं।

ए) चयनित विधि में घुसपैठ न करें जब तक कि आप इस विधि को नहीं कहें।

बी) अपनी कक्षा में एक निजी बूलियन है जो शुरू में सत्य पर सेट है। अपने PopulateListBoxmethod की शुरुआत में, इसे गलत पर सेट करें, और अंत में इसे वापस सही पर सेट करें। चयनित ईवेंट के लिए आपके ईवेंट हैंडलर में, अगर झंडा झूठा है, तो बस वापस आएं और कुछ भी नहीं करें।

सी) आपके PopulateListBoxmethod की शुरुआत में, ईवेंट से यह अनदेखा करें (this.listbox1.SelectedIndexChanged - = myMethod;) और फिर विधि पूरी होने से ठीक पहले, उस ईवेंट में फिर से देखें।

+0

उत्तर के लिए धन्यवाद। हालांकि, उपर्युक्त चरणों के बजाय, यदि मैं उपयोगकर्ता चयन परिवर्तनों को संभालने के लिए माउसक्लिक ईवेंट का उपयोग करता हूं तो क्या होगा? इस तरह माउसक्लिक ईवेंट केवल तभी निकाल दिया जाएगा जब उपयोगकर्ता चयन बदलता है और PopulateListBox() को कॉल करने पर कॉल नहीं किया जाएगा। क्या इस परिदृश्य में माउसक्लिक घटना का उपयोग करने में कोई कमी है? मैंने इसका परीक्षण किया और यह ठीक काम करता है, हालांकि मैं कुछ छिपे हुए बगों को जानना चाहता हूं जिनके कारण मुझे भविष्य में सामना करना पड़ सकता है। –

+0

माउसक्लिक दृष्टिकोण का उपयोग नहीं कर सकता। कारण: मल्टीएक्स्ड सूचीबद्ध सूची के लिए, जब माउस क्लिक को निकाल दिया जाता है, भले ही मैंने एक से अधिक आइटम चुने हैं, चयनित इंडेक्स गिनती इसे प्रतिबिंबित नहीं करती है। केवल जब चयनित इंडेक्स चेंज कहा जाता है, तो मुझे उचित गणना मिलती है। –

+0

मैं आमतौर पर विकल्प ए +1 – Cerebrus

1

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

यदि आपका चयनित इंडेक्स चेंज इवेंट हैंडलर किसी आइटम का चयन करते समय कुछ कार्यक्षमता ट्रिगर करता है तो भी आप इसे निष्पादित होने से रोकना चाहते हैं। ऐसा करने का एक तरीका यह ट्रैक रखना है कि कोड वर्तमान में सूची बॉक्स को पॉप्युलेट कर रहा है या नहीं। यदि SelectedIndexChanged का ईवेंट जबकि लिस्टबॉक्स डाला जा रहा है शुरू हो रहा है, तो आप उन कार्यों का निष्पादन बच सकते हैं:

private bool _populating = false; 
private void PopulateListBox(ListBox lb, ReportColumnList reportColumnList) 
{ 
    _populating = true; 
    lb.DataSource = reportColumnList.ReportColumns; 
    lb.DisplayMember = "ColumnName"; 
    lb.ValueMember = "ColumnName"; 

    // clear the automatically made selection 
    lb.SelectedIndex = -1; 
    _populating = false; 
} 

private void ListBox_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (!_populating) 
    { 
     // perform the action associated with selecting an item 
    } 

} 
6

इस समस्या का सबसे आसान जवाब नहीं है।

lstBxState.SelectionMode = SelectionMode.None; 
lstBxState.DataSource = lstStates; 
lstBxState.ValueMember = "StateId"; 
lstBxState.DisplayMember = "StateName"; 
lstBxState.ClearSelected(); 
lstBxState.SelectionMode = SelectionMode.One; 

इसका मतलब है, बस चयन मोड को "कोई नहीं" के रूप में बनाएं, और खुशी से डेटा नियंत्रण को बांधें। फिर आगे बढ़ें और आवश्यक मोड में मोड बदलें (यहां मैंने इसे एक में बदल दिया है, आप भी एकाधिक का चयन कर सकते हैं)।

+0

'System.Web.UI.WebControls.ListSelectionMode' में 'none' – Homer

+1

की परिभाषा नहीं है यह प्रश्न विंडोज प्रपत्रों के बारे में है, जो नामस्थान ASP.NET नियंत्रणों के लिए है। – KyleMit

1
SelectedIndexChanged विधि अंदर

, बस एक अगर बयान है कि कहते हैं में गड्ढे, अगर SelectedIndex == -1 और कुछ नहीं करते हैं, जो कुछ भी आप इस विधि में शायद नहीं सबसे कुशल कोड करने के लिए, चाहते हैं लेकिन मुझे :)

0
private void PopulateListBox(ListBox lb, ReportColumnList reportColumnList) 
{ 

    lb.SelectedIndexChanged -= this.*MethodnamewhichhandlesthisEvent*; //unset eventhandler 

    lb.DataSource = reportColumnList.ReportColumns; 
    lb.DisplayMember = "ColumnName"; 
    lb.ValueMember = "ColumnName"; 

    lb.SelectedIndexChanged += this.*MethodnamewhichhandlesthisEvent*; //set the eventhandler 
} 
के लिए काम किया

मूल रूप से ईवेंट से प्रतिनिधि को हटा दें और फिर एक बार पूरा हो जाने के बाद जोड़ें।

0

मेरी स्थिति अद्वितीय हो सकती है, लेकिन अगर मैं इसे किसी की मदद करता हूं तो मैं इसे यहां पोस्ट करूंगा।

मैं Items.AddRange को बाइंडिंग के बजाय मेरी सूची बॉक्स को पॉप्युलेट करने के लिए कर रहा था। मुझे नहीं पता क्यों, लेकिन पोस्टबैक पर, चयनित इंडेक्स -1 से 0 तक जा रहा था। ऐसा इसलिए हो सकता है क्योंकि मेरा लिस्टबॉक्स SelectionMode="Single" था।

मेरे ठीक मैन्युअल बजाय -1 0 SelectedIndex सेट करने के लिए जनसंख्या के बाद किया गया था:

listBox.Items.AddRange(items); 
listBox.SelectedIndex = 0; 
संबंधित मुद्दे