2009-06-01 14 views
20
आइटम

मैं एक ListBox में सभी आइटम का चयन करने के लिए जब एक चेकबॉक्स क्लिक किया जाता है की जरूरत का चयन करें। क्या कोड की एक पंक्ति का उपयोग करके ListBox में सभी आइटमों का चयन करना संभव है? या क्या मुझे सभी वस्तुओं के माध्यम से लूप करना होगा और उनमें से प्रत्येक के लिए सही पर सेट करना होगा?ListBox सभी

धन्यवाद :)

उत्तर

5

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

55

तथ्य यह है कि ListBox.Items एक सादा ऑब्जेक्ट संग्रह है और सादा untyped ऑब्जेक्ट्स देता है, जिसे बहु-चयनित नहीं किया जा सकता है (डिफ़ॉल्ट रूप से)।

आप सभी आइटम बहु-चयन करना चाहते हैं, तो इस काम करेगा:

for (int i = 0; i < myListBox.Items.Count;i++) 
    { 
     myListBox.SetSelected(i, true); 
    } 
+2

यह स्वीकार किए जाते हैं जवाब होना चाहिए। –

7

मैं की (समान) एक नंबर देखा है जो सभी तार्किक वही चीज़ का जवाब देता है, और मैं क्यों अभी तक चकित था वे सब मेरे लिए काम नहीं करते हैं। कुंजी लिस्टबॉक्स के SelectionModeSelectionMode.MultiSimple को स्थापित कर रही है। यह SelectionMode.MultiExtended के साथ काम नहीं करता है। किसी सूची बॉक्स में एकाधिक आइटम चुनने के लिए, आपके पास चयन मोड एकाधिक मोड पर सेट होगा, और अधिकतर लोग परंपरागत MultiExtended शैली के लिए जाते हैं, इस उत्तर को बहुत मदद करनी चाहिए। और फिर नहीं एक foreach, लेकिन for

आप वास्तव में यह करना चाहिए:

lb.SelectionMode = SelectionMode.MultiSimple; 
for (int i = 0; i < lb.Items.Count; i++) 
    lb.SetSelected(i, true); 
lb.SelectionMode = //back to what you want 

या

lb.SelectionMode = SelectionMode.MultiSimple; 
for (int i = 0; i < lb.Items.Count; i++) 
    lb.SelectedIndices.Add(i); 
lb.SelectionMode = //back to what you want 
+1

यदि आप 'e.SuppressKeyPress = true' जोड़ते हैं, तो इसे चयन मोड के बावजूद काम करना चाहिए। –

1

मैं मिका के समाधान का उपयोग, लेकिन यह आप आइटम के हजारों है, तो बहुत धीमी गति से हो सकता है। भारी गति में वृद्धि के लिए आप दृश्यता को संक्षेप में बंद कर सकते हैं। सूची बॉक्स वास्तव में ऑपरेशन के दौरान गायब नहीं होगा क्योंकि आपको संदेह हो सकता है, लेकिन चयन मेरे मामले में कम से कम 10x तेज होता है।

myListBox.Visible = false; 
for (int i = 0; i < myListBox.Items.Count;i++) 
{ 
    myListBox.SetSelected(i, true); 
} 
myListBox.Visible = true; 
+6

मेरा मानना ​​है कि 'myListBox.Visible = false' तेज़ है क्योंकि यह अद्यतन करते समय ड्राइंग से बचाता है। मैं DiogoNeves की टिप्पणी के लिए 'myListBox.BeginUpdate()' और 'myListBox.EndUpdate()' :) – DiogoNeves

+1

+1 प्रदान की गई विधियों का उपयोग करूंगा। यह बेहतर है, क्योंकि यह फोकस सूची पर रहने का भी कारण बनता है। रॉबिन के समाधान के लिए मुझे इसे फिर से दिखने के बाद myListBox.Focus() को कॉल करना होगा। – huha

7

जहां तक ​​मेरा बता सकते हैं, आइटम की एक बड़ी संख्या को चुनने के लिए नेट से किसी भी विधि का उपयोग कर एक सीधा PInvoke कॉल करने, नियंत्रित करने के लिए LB_SETSEL संदेश (0x185) गुजर की तुलना में कहीं धीमी है, के साथ एक ध्वज यह इंगित करता है कि आप चयन करना चाहते हैं (1) या अचयनित करें (0) साथ ही साथ जादू मान (-1) जो इंगित करता है कि परिवर्तन सभी वस्तुओं पर लागू होना चाहिए।

[DllImport("user32.dll", EntryPoint = "SendMessage")] 
    internal static extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam); 

    // Select All 
    SendMessage(listBox.Handle, 0x185, (IntPtr)1, (IntPtr)(-1)); 

    // Unselect All 
    SendMessage(listBox.Handle, 0x185, (IntPtr)0, (IntPtr)(-1)); 
+0

अच्छा प्रयास करें। यह वास्तव में सभी वस्तुओं का चयन करता है लेकिन आइटम गणना विफल हो जाती है। समस्या यह है कि SendMessage के बाद सभी आइटम्स का चयन करने के बाद मुझे SelectedItems.Count सभी सूची बॉक्स आइटम्स की गिनती दिखाती है (यह सही है)। लेकिन जब मैं चयनित इटम्स की गणना करने की कोशिश कर रहा हूं - केवल एक पुनरावृत्ति का प्रदर्शन किया जाता है। जब मैं 'selectItems [SelectedItems.Count - 1] निष्पादित करता हूं' इंडेक्सऑटऑफेंजेंज अपवाद फेंक दिया जाता है। लगता है कि आइटम चुने गए हैं लेकिन सूची बॉक्स उनके साथ आंतरिक सूचियों को रीफ्रेश नहीं करता है। 'SelectedObjectCollection.Count' संपत्ति गेटटर की गणना करने के लिए एक और विंडो संदेश भेजता है जो सभी वस्तुओं की गिनती देता है। – oleksa

+0

-1 वह जादू नहीं है, [LB_SETSEL संदेश (विंडोज़) देखें (http://msdn.microsoft.com/de-de/library/windows/desktop/bb761352%28v=vs.85%29.aspx) । बीटीडब्ल्यू: यह वीसीएल कक्षा टीएलिस्टबॉक्स के साथ अच्छी तरह से काम करता है। – Wolf

+0

हाय, @ वुल्फ। "जादू" शब्द का प्रोग्रामिंग में एक विशेष अर्थ है; http://en.wikipedia.org/wiki/Magic_number_(programming देखें) – EricLaw

-4
private void Button_Click(object sender, RoutedEventArgs e) 
    { 

      listbox.SelectAll(); 

    } 
+0

नेट का कौन सा संस्करण यह है? –

+0

WinForms ListBox में कोई selectAll विधि नहीं है। आप शायद डब्ल्यूपीएफ लिस्टबॉक्स के बारे में सोच रहे हैं, लेकिन इस सवाल को "विनफॉर्म" और ".net-2.0" टैग किया गया है। –

0

इस पूरी तरह से अच्छा है, लेकिन एक पाश की तुलना में बहुत तेजी से अगर आप कई कई (100+) आइटम नहीं हैं नहीं है: लिस्टबॉक्स का चयन करें और की [घर] कुंजी इनपुट और [पाली] अनुकरण [ अंत]

lb.BeginUpdate(); 
lb.Select(); 
SendKeys.Send("{Home}"); 
SendKeys.Send("+{End}"); 
lb.EndUpdate(); 

संपादित करें: मुझे लगता है कि केवल SelectionMode.MultiExtended के साथ काम करता

DoubleEDit: भी ध्यान रखें कि इस कोड के लिए बहुत धीमी गति से afterwar lb.selecteditems के साथ प्रदर्शन किया जा रहा है हो सकता है हो सकता है डीएस, लेकिन यह एक [सभी का चयन करें] बटन के लिए उपयोगी हो सकता है जिसे उपयोगकर्ता क्लिक करेगा।

+0

मेरे लिए काम नहीं करता है (नेट 4.7 का उपयोग करके)। सूची बॉक्स बस चमकता है और यही वह है। –

1

इस कन्स्ट्रक्टर के भीतर, आपको वांछित टेक्स्ट बॉक्स के बहु चयन मोड (MultiExtended) को सक्षम करने की आवश्यकता है।

private void selectAll_Click(object sender, EventArgs e) 
{ 
    for (int val = 0; val < listBox1.Items.Count; val++) 
    { 
     listBox1.SetSelected(val, true); 
    } 
} 

मैं इसे परीक्षण किया:

public Form1() 
{ 
    InitializeComponent(); 
    listBox1.SelectionMode = SelectionMode.MultiExtended; 
    listBox2.SelectionMode = SelectionMode.MultiExtended; 
} 

इस के बाद, सब कुछ का चयन करने के एक पाश का उपयोग करें। यह काम करता हैं। आप व्यक्तिगत रूप से आइटम का चयन करने के लिए [CTRL/SHIFT] बटन + पर भी क्लिक कर सकते हैं।

-1

चुनें सभी बॉक्स से बाहर निश्चित रूप से उपलब्ध है:

$("#ListBoxID option").prop("selected", true); 
+1

प्रश्न Winforms के लिए है वेब नहीं –

+0

यह कोड बॉक्स से बाहर भी नहीं है। सूचीबद्ध कोड jQuery है और सी #/VB.NET – fujiiface

1

मैं जानता हूँ कि इस सवाल का .NET 2.0 के साथ टैग है, लेकिन यदि आप 3.5+ में LINQ आप के लिए उपलब्ध है, तो आप निम्न कर सकते हैं :

ASP.NET WebForms

var selected = listBox.Items.Cast<System.Web.UI.WebControls.ListItem>().All(i => i.Selected = true); 

WinForms

var selected = listBox.SelectedItems.Cast<int>().ToArray(); 
+0

नहीं - मुझे मिलता है प्रकार या नाम ListItem नहीं मिला। (क्या आप एक प्रयोग निर्देश या असेंबली संदर्भ खो रहे हैं)। –

+0

यह समझने के लिए कि समाधान आपके लिए क्यों काम नहीं कर सकता है, व्यक्ति के साथ काम करने के बजाय समाधान को कम करने के लिए थोड़ा अधिक लगता है। क्या आपके पास सिस्टम.Web.UI.WebControls का उपयोग कर निर्देश का उपयोग करना शामिल है; '? क्या आप असेंबली का संदर्भ दे रहे हैं? विधानसभा के संदर्भ में उत्तर अपडेट किया गया। – fujiiface

+0

क्षमा करें फ़ुजीफ़ेस - मैंने आपको फिर से उखाड़ फेंक दिया। मैंने शुरुआत में सोचा था कि आपने 2014 में अपनी पोस्ट वापस लिखी थी इसलिए मुझे प्रतिक्रिया की उम्मीद नहीं थी। मैं System.Web.UI.WebControls तक नहीं पहुंच पा रहा हूं। मैं देख सकता हूं System.Web है। और मैंने इसका संदर्भ जोड़ने की कोशिश की लेकिन यह वहां भी दिखाई नहीं दे रहा है। शायद यह 4.7 में बहिष्कृत किया गया था? मैंने उस नाम के साथ एक NuGet पैकेज की तलाश की और वह वहां नहीं है। –

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