2009-06-01 123 views
20

我需要在列表框中選擇所有項目被點擊一個複選框時。是否可以使用一行代碼來選擇ListBox中的所有項目?或者我將不得不循環遍歷所有項目併爲每個項目設置爲true?列表框中選擇所有項目

謝謝:)

回答

5

我想你必須在這裏循環。一次選擇所有項目是一個非常具體的(可能很少見的)用例,在這種情況下,提供這種功能是沒有意義的。此外,循環將只是兩行代碼。

55

事實是ListBox.Items是一個普通的對象集合,並返回普通無類型的對象,不能是多選擇的(默認)。

如果你想多選擇所有項目,那麼這將工作:

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

這應該是公認的答案。 – 2015-04-30 12:44:39

7

我已經看到了一些(類似的)回答所有這一切在邏輯上做同樣的事情,我很困惑,爲什麼還他們都不爲我工作。關鍵是將列表框的SelectionMode設置爲SelectionMode.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 

OR

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;'它應該工作,不管SelectionMode。 – 2014-12-24 14:14:57

1

我用Mika的解決方案,但是如果你有上千項這可能是非常緩慢的。爲了大幅度提高速度,您可以暫時關閉可視性。列表框在操作過程中不會真正消失,因爲您可能會懷疑,但在我的情況下,選擇速度至少快10倍。

​​
+6

我相信'myListBox.Visible = false'更快,因爲它避免了更新時的繪圖。我會使用提供的方法'myListBox.BeginUpdate()'和'myListBox.EndUpdate()':) – DiogoNeves 2012-05-22 09:09:48

+1

+1來評論DiogoNeves。它更好,因爲它也會導致焦點留在列表框中。對於Robin的解決方案,必須在將其設置爲可見後再調用myListBox.Focus()。 – huha 2014-03-04 08:24:00

7

據我所知,使用任何的.NET方法來選擇大量項目是遠遠超過進行直接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顯示所有列表框項目的計數(這是正確的)。但是當我試圖枚舉SelectedItems時 - 只執行一次迭代。當我執行'SelectedItems [SelectedItems.Count - 1]'拋出IndexOutOfRange異常。似乎選擇了項目,但列表框不會刷新與它們的內部列表。要計算'SelectedObjectCollection.Count'屬性getter發送另一個返回所有項目計數的窗口消息。 – oleksa 2014-06-06 13:59:00

+0

-1不是那麼神奇,請參閱[LB_SETSEL消息(Windows)](http://msdn.microsoft.com/de-de/library/windows/desktop/bb761352%28v=vs.85%29.aspx) 。順便說一句:它適用於VCL類TListBox。 – Wolf 2015-01-15 12:19:30

+0

嗨,@狼。術語「魔術」在編程中有特別的意義;請參閱http://en.wikipedia.org/wiki/Magic_number_(programming) – EricLaw 2015-01-15 17:13:23

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

      listbox.SelectAll(); 

    } 
+0

哪個版本的.Net是這個? – 2014-10-27 00:10:42

+0

WinForms列表框中沒有SelectAll方法。你可能正在考慮WPF列表框,但這個問題被標記爲「winforms」和「.net-2.0」。 – 2014-12-24 13:19:11

0

這絕對不是好的,但不是一個循環,如果你有很多很多(100+)項目快得多: 選擇列表框和模擬[家居]鍵輸入[SHIFT] + [結束]

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

編輯:用SelectionMode.MultiExtended只能我猜

DoubleEDit:也意識到這可能是代碼lb.selecteditems戰後正在執行太慢ds,但對於用戶點擊的[Select All]按鈕可能會有用。

+0

不適用於我(使用.Net 4.7)。列表框只是閃爍,就是這樣。 – 2017-10-26 15:49:14

1

在這個構造函數,你需要啓用所需的文本框的多選擇模式(MultiExtended)。

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

在此之後,使用循環選擇一切:

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

我測試了它。有用。您還可以使用[CTRL/SHIFT]按鈕+左擊單獨選擇項目。

-1

選擇全部是definetly現成可用的:

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

該問題是爲winforms而不是網絡 – 2017-02-19 23:41:12

+0

此代碼也不是開箱即用。列出的代碼是jQuery,而不是C#/ VB.NET – fujiiface 2017-06-14 22:27:44

1

我知道這個問題被打上.NET 2.0,但如果你有LINQ提供給您的3.5+,你可以做以下:

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。 (您是否缺少Using指令或程序集引用)。 – 2017-10-26 15:50:54

+0

看起來有點過分,可能會降低解決方案的效率,而不是與個人合作,找出解決方案爲什麼不適合您。你有沒有提到缺少使用指令'使用System.Web.UI.WebControls;'?您是否參考裝配體?答覆已更新以引用裝配體。 – fujiiface 2017-10-26 16:28:51

+0

對不起fujiface - 我再次提醒你。我最初以爲你在2014年寫了你的帖子,所以我沒有期待回覆。我似乎無法訪問System.Web.UI.WebControls。我只能看到System.Web。我試圖添加一個引用,但它並沒有顯示在那裏。也許它在4.7中被棄用了?我查找了一個名稱爲NuGet的軟件包,但這也不在其中。 – 2017-10-26 16:35:41

相關問題