2012-10-31 26 views
16

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

मैं इस तरह की कोशिश की:

ListBox.SelectedObjectCollection selectedItems = new ListBox.SelectedObjectCollection(lstClientes); 
    selectedItems = lstClientes.SelectedItems; 
if (lstClientes.SelectedIndex != -1) 
{ 
    foreach (string s in selectedItems) 
     lstClientes.Items.Remove(s); 
} 
else 
    MessageBox.Show("Debe seleccionar un email"); 

उत्तर

28

आप जबकि (एक foreach का प्रयोग करके) पुनरावृत्ति के माध्यम से यह एक संग्रह संशोधित नहीं कर सकते। इसके बजाय एक रिवर्स for पाश का उपयोग करें:

ListBox.SelectedObjectCollection selectedItems = new ListBox.SelectedObjectCollection(lstClientes); 
selectedItems = lstClientes.SelectedItems; 

if (lstClientes.SelectedIndex != -1) 
{ 
    for (int i = selectedItems.Count - 1; i >= 0; i--) 
     lstClientes.Items.Remove(selectedItems[i]); 
} 
else 
    MessageBox.Show("Debe seleccionar un email"); 

एक रिवर्स पाश का उपयोग सुनिश्चित करता है कि आप किसी भी छोड़ नहीं है उन्हें हटाने के बाद।

+2

हाँ, यह है! धन्यवाद! बस थोड़ा सुधार: (int i = selectItems.Count - 1; i> = 0; ** i - **) – Cristo

+0

ओह, अच्छी आंख, धन्यवाद! –

+0

आइटम सूची में कोई आइटम दो बार मौजूद होने पर एक छोटी सी बग हो सकती है और केवल दूसरा चयनित होता है। मुझे लगता है कि पहला व्यक्ति हटा दिया जा सकता है। आइटम्स के साथ एक समाधान। RemoveAt (i) थोड़ा बेहतर हो सकता है। लेकिन पुनरावृत्ति को उलटना भी अधिक महत्वपूर्ण होगा! – Pieter21

6
selectedItems = lstClientes.SelectedItems; 

यह पंक्ति एक नया संग्रह नहीं बना है, लेकिन एक लिस्टबॉक्स में एक के लिए एक संदर्भ सेट। तो आप एक संग्रह के माध्यम से पुनरावृत्त कर रहे हैं और एक बार में वस्तुओं को हटाने की कोशिश कर रहे हैं। यह संभव नहीं है

उदाहरण के लिए आप इस इस्तेमाल कर सकते हैं,:

foreach (string s in lstClientes.SelectedItems.OfType<string>().ToList()) 
    lstClientes.Items.Remove(s); 
+0

क्षमा करें कि मेरे लिए संकलित नहीं किया गया – Cristo

+1

@ CristobalDeIncógnitoFlipo आप शायद सिस्टम का उपयोग करने के लिए आवश्यक है। लिंक; 'आपकी उपयोग सूची में, क्योंकि यह कोड LINQ का उपयोग ऑब्जेक्ट्स – horgh

+0

मेरी खराब है। मैं linq नहीं जानता। यह भी काम करता है ^^ – Cristo

6

सिर्फ इस तरह सरल:

while (lst.SelectedItems.Count > 0) 
{ 
    lst.Items.Remove(lst.SelectedItems[0]); 
} 
+0

यह क्रूर है, लेकिन छोटे एन के लिए ठीक काम करता है। ये उत्तर अभी भी कुछ भी बारीकी से सुरुचिपूर्ण याद करते हैं - जो सूचकांक निकालने के लिए कुछ LINQ चाल हो सकता है और इटरेटर (कुछ 'ToArray', और फिर कुछ जादू ...)। खैर, मुझे डर है कि रिवर्स केवल .NET 4.5 के साथ आता है: http://msdn.microsoft.com/pl-pl/library/bb358497%28v=vs.110%29.aspx –

1

मैं बेहतर समाधान मिल गया।

 if (listBoxIn.SelectedItems.Count != 0) 
     { 
      while (listBoxIn.SelectedIndex!=-1) 
      { 
       listBoxIn.Items.RemoveAt(listBoxIn.SelectedIndex);     
      } 
     } 
+1

स्टैक ओवरफ़्लो में आपका स्वागत है! केवल कोड ही उत्तर हमेशा यहां बहुत संक्षिप्त होते हैं। अपने उत्तर में कुछ संदर्भ दें। इस मामले में, जैसा कि सवाल बहुत पुराना है, यह ध्यान देने योग्य है कि आपका उत्तर स्वीकार किए गए, उल्लिखित उत्तर में कुछ अतिरिक्त क्यों जोड़ता है। –

2
lst.Items.Remove(lst.Items[lst.SelectedIndex]); 

आप इस का उपयोग कर सकते हैं अगर आप पाश नहीं करना चाहती

नोट: यह केवल (एकाधिक चयन यह केवल पहले चयनित आइटम को हटा देगा)

0
1 आइटम को हटाने के लिए काम करता है

यह चयनित

आइटम
for(int v=0; v<listBox1.SelectedItems.Count; v++) { 
      listBox1.Items.Remove(listBox1.SelectedItems[v]); 
     } 
+0

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

+0

क्या होगा यदि किसी ने एकाधिक आइटम चुने हैं? –

1

दूर करने के लिए सबसे आसान तरीका है मैं इस एक ही समस्याओं का सामना करना पड़ा है मीटर आज और कुछ थोड़ा क्लीनर चाहते थे, और इस Linq समाधान के साथ आया था:

foreach (int index in myListBox.SelectedIndices.Cast<int>().Select(x => x).Reverse()) 
    myListBox.Items.RemoveAt(index); 

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

0

एक वैश्विक चर बनाएँ:,

private void lsbx_layers_SelectedIndexChanged(object sender, EventArgs e) 
     { 

      layerindex = lsbx_layers.SelectedIndices[0];//selected index that has fired the event 
     } 

अंत तत्व निकाल:

public partial class Form1 : Form 
    { 

     Int32 index; 
    } 

फिर चयनित सूचकांक परिवर्तन पर वर आप परिभाषित में है कि सूचकांक को बचाने

lsbx_layers.Items.RemoveAt(Layerindex);