Управление выбором и копированием строк 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). |