Как выбрать все элементы в списке на флажке CheckBox? -- c# поле с участием winforms поле с участием listbox поле с участием .net-2.0 пол Связанный проблема

How do I select all items in a listbox on checkbox checked?


29
vote

проблема

русский

Мне нужно выбрать все элементы в списке, когда нажат флажок. Можно ли выбрать все элементы в списке, используя одну строку кода? Или я должен будет питаться через все предметы и установить выбранную для True для каждого из них?

Английский оригинал

I need to select all items in a ListBox when a CheckBox is clicked. Is it possible to select all items in the ListBox using a single line of code? Or will I have to loop through all items and set selected to true for each one of them?

</div
           

Список ответов

5
 
vote
vote
Лучший ответ
 

Я думаю, что вы должны зацикливаться здесь. Выбор всех элементов сразу является довольно конкретным (и, вероятно, редким) корпусом, где он просто не имеет смысла предлагать эту функциональность из коробки. Кроме того, цикл в любом случае будет только две строки кода.

 

I think you have to loop here. Selecting all items at once is a pretty specific (and probably rare) use case where it simply makes no sense to offer that functionality out of the box. Furthermore, the loop will be just two lines of code anyway.

</div
 
 
69
 
vote

Дело в том, что <Код> ListBox.Items - это обычная коллекция объектов и возвращает простое неразъедные объекты, которые не могут быть несколько выбраны (по умолчанию).

Если вы хотите многоизмереть все элементы, то это будет работать:

 <код>    for (int i = 0; i < myListBox.Items.Count;i++)    {        myListBox.SetSelected(i, true);    }   
 

The fact is that ListBox.Items is a plain object collection and returns plain untyped objects, which cannot be multi-selected (by default).

If you want to multi-select all items, then this will work:

   for (int i = 0; i < myListBox.Items.Count;i++)    {        myListBox.SetSelected(i, true);    } 
</div
 
 
 
 
8
 
vote

Насколько я могу сказать, используя любой из методов .NET для выбора большого количества элементов, намного медленнее, чем сделать прямое вызов PinVoke, передавая сообщение LB_SESEL (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));   
 

As far as I can tell, using any of the .NET methods to select a large number of items is far slower than making a direct PInvoke call, passing the LB_SETSEL message (0x185) to the control, with a flag indicating whether you want to Select (1) or Unselect (0) as well as the magic value (-1) which indicates that the change should apply to all items.

  [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)); 
</div
 
 
         
         
8
 
vote

Я видел ряд (подобных) ответов, которые все что логически то же самое, и я был сбит с толку, почему они все еще не работают для меня. Ключ находится настроек ListBox <код> 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   

или

 <код>    for (int i = 0; i < myListBox.Items.Count;i++)    {        myListBox.SetSelected(i, true);    } 0  
 

I have seen a number of (similar) answers all which does logically the same thing, and I was baffled why yet they all dont work for me. The key is setting listbox's SelectionMode to SelectionMode.MultiSimple. It doesn't work with SelectionMode.MultiExtended. Considering to select multiple items in a listbox, you will have selection mode set to multiple mode, and mostly people go for the conventional MultiExtended style, this answer should help a lot. And ya not a foreach, but for.

You should actually do this:

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 
</div
 
 
 
 
1
 
vote

Я использую решение Mika, однако это может быть очень медленно, если у вас есть тысячи предметов. Для огромного увеличения скорости вы можете кратко выключить видимость. ListBox на самом деле не исчезнет во время операции, как вы можете подозревать, но выбор происходит как минимум 10 раз в моем случае не менее 10x.

 <код>    for (int i = 0; i < myListBox.Items.Count;i++)    {        myListBox.SetSelected(i, true);    } 1  
 

I use Mika's solution, however this can be very slow if you have thousands of items. For a massive speed increase you can turn off visibility briefly. The listbox will not actually disappear during the operation as you might suspect, but the selection occurs at least 10x faster in my case.

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

В этом конструкторе вам необходимо включить режим мульти выбора (<код> for (int i = 0; i < myListBox.Items.Count;i++) { myListBox.SetSelected(i, true); } 2 ) нужного текстового поля.

 <код>    for (int i = 0; i < myListBox.Items.Count;i++)    {        myListBox.SetSelected(i, true);    } 3  

После этого используйте цикл, чтобы выбрать все:

 <код>    for (int i = 0; i < myListBox.Items.Count;i++)    {        myListBox.SetSelected(i, true);    } 4  

Я проверил это. Оно работает. Вы также можете использовать кнопку [CTRL / SHIFT] + щелчок левой кнопкой мыши , чтобы выбрать элементы индивидуально.

 

Within this Constructor, you need to enable the multi selection mode (MultiExtended) of the desired text box.

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

After this, use a loop to select everything:

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

I tested it. It works. You can also use the [CTRL/SHIFT] button + left click to select the items individually.

</div
 
 
1
 
vote

В моем случае у меня было 10k + элементы, метод базового цикла занимал почти минуту для завершения. Использование @diogonesves отвечает и расширяя его, я хотел выбрать все (Ctrl + A) и AMP; Скопируйте (Ctrl + C). Я обрабатывал эти 2 способами. Я использовал Beginupdate () и endupdate (), чтобы отложить чертеж, но я также добавил прямую копию All (Ctrl + Shift + C), который даже не беспокоит элементы перед копированием.

 <код>    for (int i = 0; i < myListBox.Items.Count;i++)    {        myListBox.SetSelected(i, true);    } 5  
 

In my case i had 10k+ items, the basic loop method was taking almost a minute to complete. Using @DiogoNeves answer and extending it i wanted to be able to select all (Ctrl+A) & copy (Ctrl+C). i handled this 2 ways. i used the BeginUpdate() and EndUpdate() to defer drawing but i also added a direct copy all (Ctrl+Shift+C) which doesn't even bother to select the items before copying.

private static void HandleListBoxKeyEvents(object sender, KeyEventArgs e) {     var lb = sender as ListBox;     // if copy     if (e.Control && e.KeyCode == Keys.C)     {         // if shift is also down, copy everything!         var itemstocopy = e.Shift ? lb.Items.Cast<object>() : lb.SelectedItems.Cast<object>();         // build clipboard buffer         var copy_buffer = new StringBuilder();         foreach (object item in itemstocopy)             copy_buffer.AppendLine(item?.ToString());         if (copy_buffer.Length > 0)             Clipboard.SetText(copy_buffer.ToString());     }     // if select all     else if (e.Control && e.KeyCode == Keys.A)     {         lb.BeginUpdate();         for (var i = 0; i < lb.Items.Count; i++)             lb.SetSelected(i, true);         lb.EndUpdate();     } } 
</div
 
 
0
 
vote

Это абсолютно не приятно, но намного быстрее, чем петля, если у вас много много (100+) предметов: Выберите ListBox и смоделируйте ввод ключа [Home] и [Shift] + [End]

 <код>    for (int i = 0; i < myListBox.Items.Count;i++)    {        myListBox.SetSelected(i, true);    } 6  

Редактировать: работает с выборомMode.multiexted, только я думаю,

DoverEdit: также имейте в виду, что это может быть слишком медленно для выполнения кода с LB.SESECENTITESTEMS впоследствии, но может быть полезно для кнопки [Выбрать все], что пользователь нажимает.

 

this is absolutely not nice but much faster than a loop if you have many many (100+) items: Select the Listbox and simulate key input of [home] and [shift]+[end]

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

EDIT: works with SelectionMode.MultiExtended only I guess

DoubleEDit: also be aware that this might be too slow for code being performed with lb.selecteditems afterwards, but it may be useful for an [Select All] button that the user will click.

</div
 
 
 
 
0
 
vote

Выбрать все определенно доступно из коробки:

 <код>    for (int i = 0; i < myListBox.Items.Count;i++)    {        myListBox.SetSelected(i, true);    } 7  
 

Select All is definetly available out of the box:

$("#ListBoxID option").prop("selected", true); 
</div
 
 
     
     
0
 
vote

Я знаю, этот вопрос помечен .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();   
 

I know this question is tagged with .NET 2.0 but if you have LINQ available to you in 3.5+, you can do the following:

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(); 
</div
 
 
         
         
0
 
vote

Я добавил идею Nawfal к тому, что я уже имел, которая также была с «началом языка». Дополнительно дополнительное положение о представлении также поддерживается, так как пользователь ожидал. Для меня это, кажется, решает все проблемы сейчас:

 <код> public void SelectAll() {     bool prevBusy = MouseHelper.IsBusy;     MouseHelper.IsBusy = true;     int topIndex = TopIndex;      // BUG: In 'SelectionMode.MultiExtended' the box gets crazy     SelectionMode previousMode = this.SelectionMode;     this.SelectionMode = SelectionMode.MultiSimple;      this.BeginUpdate();      for (int i = 0; i < Items.Count; i++)     {         SelectedIndices.Add(i);     }      this.EndUpdate();     this.SelectionMode = previousMode;      TopIndex = topIndex;     MouseHelper.IsBusy = prevBusy; }   
 

I added nawfal's idea to what I had already, which was also with 'BeginUpdate'. Additionaly the view position is maintained too, as the user would expect. For me this seems to solve all problems now:

public void SelectAll() {     bool prevBusy = MouseHelper.IsBusy;     MouseHelper.IsBusy = true;     int topIndex = TopIndex;      // BUG: In 'SelectionMode.MultiExtended' the box gets crazy     SelectionMode previousMode = this.SelectionMode;     this.SelectionMode = SelectionMode.MultiSimple;      this.BeginUpdate();      for (int i = 0; i < Items.Count; i++)     {         SelectedIndices.Add(i);     }      this.EndUpdate();     this.SelectionMode = previousMode;      TopIndex = topIndex;     MouseHelper.IsBusy = prevBusy; } 
</div
 
 
-5
 
vote
 <код> private void Button_Click(object sender, RoutedEventArgs e)     {              listbox.SelectAll();      }   
 
private void Button_Click(object sender, RoutedEventArgs e)     {              listbox.SelectAll();      } 
</div
 
 
   
   

Связанный проблема

3  OnleftClick & OnrightClick JavaScript Функции  ( Onleftclick onrightclick javascript functions ) 
В моем боковом коде сервера я динамически строим таблицу и именно сейчас я добавляю следующий код, чтобы обрабатывать Щелчок строки. <код> tr.Attributes.Add...

-2  Группировка результатов от XPathSelectelements в C #  ( Grouping results from xpathselectelements in c sharp ) 
У меня есть XML в следующей структуре <код> <root> <Node> <value>a</value> <value>b</value> <value>c</value> </Node> ...

3  Как я могу использовать список?  ( How can i use listdictionary ) 
Я могу заполнить мой список listdicticatic, но, если запущена ошибка, возвращается мне в "Foreach (kne ky ky в ld.keys)" (исключение недействительной операции...

14  Структура космического эффекта в памяти для отсортированного текста поддерживает префикс поиска  ( Space efficient in memory structure for sorted text supporting prefix searches ) 
У меня есть проблема: мне нужен космический поиск файловой системы, основанных на префиксе файлового пути. Преобразование поиска отсортированного текста, друг...

9  Ответ ASP.NET.redirect с jQuery Mobile - URL-хешированием  ( Asp net response redirect with jquery mobile url hashing ) 
У меня есть стандартные формы Auth Asp.net приложение. Моя регистрация и страница входа в систему находятся в одном файле .aspx с 2 мобильными страницами jQue...

-6  Linux и CSHARP, проверьте, если файл / папка не существует в Linux, если так, запустите mkdir через csharp ssh - [закрыто]  ( Linux and csharp check if file folder doesnt exist in linux if so run mkdir ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыт . Этот вопрос нуждается в Детали или ясность . В настоящее...

1  Очистка C # код  ( Cleaning up c sharp code ) 
Есть ли какой-нибудь инструмент, который очищает C # .NET кода всех комментариев, отладки, документацию при развертывании его на сервер? Я хочу использовать...

1  C # Словарь <Объект, t> Значение поиска  ( C sharp dictionaryobject t lookup value ) 
Не уверены, как лучшее фразу, наверное, это, вероятно, почему у меня трудно посмотреть это. Вот приложение для пробной консоли для демонстрации моего значения...

0  Что это за кодирование? (Найдено в Outlook / filitory)  ( What is this encoding found in outlook filesite ) 
Я работаю над Addin Outlook VSTO, который будет подключать аддин для файлового файла imagiate, я в настоящее время пытаюсь получить доступ к идентификатору в ...

0  .NET Условно используют библиотеку .NET, если установлено  ( Net conditionally use a net library if installed ) 
Мой вопрос довольно просто. Я хочу добавить новый раздел в мой проект, который будет использоваться библиотеки SMO ​​.NET (объект управления SQL Server). Я сч...

0  Причина определенных ограничений на преобразования дисперсии в C #  ( Reason for certain restrictions on variance conversions in c sharp ) 
У меня есть несколько вопросов о том, как неявные преобразования между методом делегатов в отношении ковариации и контравариации реализуются в C #. <код> de...

0  Каркас экспорта данных или инструменты  ( Data export framework or tools ) 
Есть ли какие-либо данные экспорта данных в .NET или что-то. Мне нужно устройство набора инструментов для экспорта наследие и данных из более старых / устарев...

31  C # DateTime: какую «дату» использовать, когда я использую только «время»?  ( C sharp datetime what date to use when im using just the time ) 
Я использую <код> DateTime в c #, чтобы отобразить время. На какую порту даты каждый использует при построении времени? e.g. Ниже недействительно, потому ч...

2  Исключить одно поле из NHB грязной оптимистической блокировки  ( Exclude one field from nhb dirty optimistic locking ) 
Мы устанавливаем наши обновления сущностей с грязным оптимистичным блокировкой в ​​конфигурации NHB: <код> .Override<OurEntity>(x => { x.DynamicUpdate()...

14  Datagridviewcomboboxcolumn Добавление различных элементов к каждой строке  ( Datagridviewcomboboxcolumn adding different items to each row ) 
Я создаю таблицу, используя datagridview, где пользователь может выбрать элементы из раскрывающегося списка в каждой ячейке. Чтобы упростить проблему, давайте...

Связанный проблема

3  OnleftClick & OnrightClick JavaScript Функции 
-2  Группировка результатов от XPathSelectelements в C # 
3  Как я могу использовать список? 
14  Структура космического эффекта в памяти для отсортированного текста поддерживает префикс поиска 
9  Ответ ASP.NET.redirect с jQuery Mobile - URL-хешированием 
-6  Linux и CSHARP, проверьте, если файл / папка не существует в Linux, если так, запустите mkdir через csharp ssh - [закрыто] 
1  Очистка C # код 
1  C # Словарь <Объект, t> Значение поиска 
0  Что это за кодирование? (Найдено в Outlook / filitory) 
0  .NET Условно используют библиотеку .NET, если установлено 
0  Причина определенных ограничений на преобразования дисперсии в C # 
0  Каркас экспорта данных или инструменты 
31  C # DateTime: какую «дату» использовать, когда я использую только «время»? 
2  Исключить одно поле из NHB грязной оптимистической блокировки 
14  Datagridviewcomboboxcolumn Добавление различных элементов к каждой строке