Программирование PC Управление выбором и копированием строк ListBox Fri, December 06 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


Управление выбором и копированием строк ListBox Печать
Добавил(а) microsin   

У класса ListBox есть свойство SelectionMode, которое управляет поведением выбора элементов (строк) ListBox. Свойство SelectionMode может быть в одном из четырех значений: None, One, MultiSimple и MultiExtended.

[Режимы выбора строк ListBox]

SelectionMode.None. В этом режиме выделение строк не работает. Клик мыши на строке просто делает формально текущей.

SelectionMode.One. Это состояние по умолчанию. В этом режиме строки можно выбирать только по одной, либо путем клика мышью, либо программно.

SelectionMode.MultiSimple. В этом режиме строки можно выбирать несколько строк. Клики мышью на строках срабатывают как триггер выбора - первый клик выбирает строку, второй клик отменяет выбор.

SelectionMode.MultiExtended. В этом режиме выбор нескольких строк работает так, как обычно принято для пользовательского интерфейса Windows, потому что на способ выбора теперь влияют кнопки Shift и Ctrl. Это более удобный и привычный режим. Удержание Shift и клик позволяет выбрать сразу несколько строк, а удержание Ctrl позволяет выбирать строки и снимать выделение по одной строке.

[Как программно выбирать строки ListBox]

Можно программно выбирать строки с помощью метода SetSelected, указывая нужную строку по её индексу. Пример выделения всех строки ListBox (обрабатывается нажатие клавиш Ctrl+A):

private void listBox1_KeyDown(object sender, KeyEventArgs e)
{
   if (e.Control && e.KeyCode == Keys.A)
   {
      listBox1.BeginUpdate();
      for (int i = 0; i < listBox1.Items.Count; i++)
         listBox1.SetSelected(i, true);
      listBox1.EndUpdate();
   }
}

Обратите внимание на использование методов BeginUpdate и EndUpdate, что бывает полезно, когда в ListBox много строк. BeginUpdate и EndUpdate предотвращают обновление списка ListBox при вызовах SetSelected, что ускоряет обработку цикла по строкам ListBox.

[Как копировать строки ListBox в буфер обмена]

Этот способ подходит для копирования одной строки (обрабатывается нажатие клавиш Ctrl+C):

private void listBox1_KeyDown(object sender, KeyEventArgs e)
{
   if (e.Control == true && e.KeyCode == Keys.C)
   {
      string s = listBox1.SelectedItem.ToString();
      Clipboard.SetData(DataFormats.StringFormat, s);
   }
}

Так можно скопировать несколько выбранных строк:

private void listBox1_KeyDown(object sender, KeyEventArgs e)
{
   if (e.Control && e.KeyCode == Keys.C)
   {
      System.Text.StringBuilder copy_buffer = new System.Text.StringBuilder();
      foreach (object item in listBox1.SelectedItems)
         copy_buffer.AppendLine(item.ToString());
      if (copy_buffer.Length > 0)
         Clipboard.SetText(copy_buffer.ToString());
   }
}

[Ссылки]

1. Visual Studio C#: часто задаваемые вопросы (FAQ).
2. Как прокрутить вниз DataGridView и ListBox.

 

Добавить комментарий


Защитный код
Обновить

Top of Page