У класса 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. |