Как сделать красивый listbox
Элемент управления ListBox (список)
представляет собой простой список.
Ключевым свойством этого элемента является
свойство Items,
которое как раз
и хранит набор
всех элементов
списка.
2
Работа со списками
При работе со списками программисту обычно
приходится решать следующие задачи:
добавление (вставка) в список новых элементов;
удаление элементов из списка;
замещение элемента списка новым значением;
определение выделенного элемента списка (или
нескольких, если список допускает множественное
выделение).
3
Записи в список добавляются одним из
двух способов:
1. В режиме конструктора с помощью коллекции Items из
окна Свойства;
При нажатии на многоточие появляется окно Редактор коллекции строк
(String Collection Editor)
Список заполняется элементами
так же, как и многострочное
текстовое поле
2.
В программном коде с
помощью метода ADD.
4
Добавление элементов
Для добавления в конец списка новых элементов
служит метод Add() объекта Items списка.
Формат вызова метода:
ИмяСписка.Items.Add(дoбaвляeмaя_cтpoкa)
Все элементы списка входят в свойство Items,
которое представляет собой коллекцию. Для
добавления нового элемента в эту коллекцию, а
значит и в список, надо использовать метод Add,
например:
listBox1.Items.Add("Новый элемент");
При использовании этого метода каждый
добавляемый элемент добавляется в конец
списка.
Можно добавить сразу несколько элементов,
например, массив. Для этого используется
метод AddRange:
string[] animals = ;
listBox1.Items.AddRange(animals);
Вставка элементов
Чтобы вставить элемент в произвольное место
списка (а не только в конец), можно воспользоваться
методом Insert():
ИмяСписка.Items.Insert(Hoмep, вставляемая_строка)
где Номер — это порядковый номер
позиции в списке, на которую будет
помещена вставляемая строка.
Первая позиция имеет номер 0, вторая
— 1 и т. д.
string[] animals = "Мышь", "Кролик", "Слон">;
listBox1.Items.AddRange(animals);
listBox1.Items.Insert(1, "Носорог");
В данном случае вставляем элемент на вторую позицию
в списке, так как отсчет позиций начинается с нуля.
Удаление элементов
Для удаления элемента списка служат два метода:
Remove() и RemoveAt()
Метод Remove() удаляет из списка строку, переданную ему в
качестве аргумента:
ИмяСписка.Items.Реmоvе(удаляемая_строка)
Метод RemoveAt() удаляет строку, находящуюся на заданной
позиции в списке:
ИмяСписка.Items.RemoveAt(nopядкoвый_нoмep_yдa
ляeмoro_элeмeнтa)
Иногда требуется удалить из списка все элементы.
Для этого можно воспользоваться методом Clear():
ИмяСписка.Сlеаг()
7
Удаление элементов
Для удаления элемента по его тексту используется
метод Remove:
string[] animals = ;
listBox1.Items.AddRange(animals);
listBox1.Items.Insert(1, "Носорог");
listBox1.Items.Remove(«Мышь");
Чтобы удалить элемент по его индексу в списке,
используется метод RemoveAt:
listBox1.Items.RemoveAt(3);
Можно очистить сразу весь список, применив
метод Clear:
listBox1.Items.Clear();
Основные свойства списков
HorizontalScrollbar - управляет отображением
горизонтальной полосы прокрутки (ГПП).
Значение False – ГПП никогда не отображается.
True – ГПП будет отображаться, если хотя бы один элемент
списка имеет ширину, большую, чем ширина самого списка.
ScrollAlwaysVisible - определяет, всегда ли отображаются
полосы прокрутки:
True - всегда; False -по мере надобности.
Sorted - значение True означает, что элементы списка будут
автоматически сортироваться в алфавитном порядке
9
SelectionMode - управляет возможностью выбора
пользователем сразу нескольких элементов списка:
По умолчанию список поддерживает выделение одного элемента. Чтобы
добавить возможность выделения нескольких элементов, надо установить
у его свойства SelectionMode значение MultiSimple.
Чтобы выделить элемент програмно, надо применить метод
SetSelected(int index, bool value),
где index - номер выделенного элемента. Если второй параметр - value
имеет значение true, то элемент по указанному индексу выделяется,
если false, то выделение наоборот скрывается:
listBox1.SetSelected(2, true); // будет выделен третий элемент
Значение свойства
None
One
Описание
Выбор элементов списка запрещен
Можно выбрать лишь один элемент списка
MultiSimple
Можно выбрать несколько элементов списка;
MultiExtended
Можно выбрать несколько элементов списка,
используя клавиши Shift и Ctrl
10
Метод Count позволяет определить количество
элементов в списке:
Items.Count
Число элементов в
списке
Определение выделенных элементов списка:
Свойства
SelectedIndex
Описание
возвращает или устанавливает номер
выделенного элемента списка. Если
выделенные элементы отсутствуют,
тогда свойство имеет значение -1
SelectedItem
возвращает или устанавливает текст
выделенного элемента
Selectedlndides
возвращает или устанавливает
коллекцию выделенных элементов в
виде набора их индексов
SelectedItems
возвращает или устанавливает
выделенные элементы в виде
коллекции
11
Обычно с системными свойствами
работают через код программы и
вызывают из справочной системы, в
которой имеется пояснение их
работы (Ctrl+Space):
Событие
SelectedIndexChanged
Из всех событий элемента ListBox
надо отметить в первую очередь
событие SelectedIndexChanged,
которое возникает при изменении
выделенного элемента:
label1
label2
private void Form1_Load(object sender, EventArgs e)
string[] animals = ;
listBox1.Items.AddRange(animals);
>
private void listBox1_SelectedIndexChanged(object sender,
EventArgs e)
string selectedanimals = listBox1.SelectedItem.ToString();
MessageBox.Show(selectedanimals);
label1.Text = listBox1.SelectedIndex.ToString();
label2.Text = listBox1.Items.Count.ToString();
>
Элемент управления CheckedListBox
Элемент CheckedListBox представляет симбиоз
компонентов ListBox и CheckBox. Для каждого
элемента такого списка определено специальное
поле CheckBox, которое можно отметить.
Элемент
CheckedListBox
обладает
всеми свойствами
элемента ListBox,
добавляя при этом
несколько новых –
CheckOnClick,
Checkedlndides и
Checkedltems.
14
Чтобы поставить отметку в checkBox
рядом с элементом в списке, нам надо
сначала
выделить
элемент
и
дополнительным щелчком уже установить
флажок. Однако это не всегда удобно, и с
помощью свойства CheckOnClick и
установке для него значения true мы
можем определить сразу выбор элемента
и установку для него флажка в один клик.
Свойство CheckOnClick
Значение данного свойства, равное True, означает, что
флажок, соответствующий элементу списка, будет
устанавливаться и сниматься первым же щелчком на
элементе.
В противном случае первый щелчок лишь выделит
элемент, второй щелчок изменит состояние сопоставленного
элементу флажка
15
Свойства-коллекции Checkedlndicies и Checkedltems
содержат порядковые номера и значения выбранных
элементов (то есть тех элементов, чей флажок
установлен).
Эти коллекции используются совершенно аналогично
коллекциям Selectedlndides и Selectedltems.
Для добавления и удаления элементов в CheckedListBox
определены все те же методы, что и в ListBox:
•Add(item): добавляет один элемент
•AddRange(array): добавляет в список массив элементов
•Insert(index, item): добавляет элемент по определенному
индексу
•Remove(item): удаляет элемент
•RemoveAt(index): удаляет элемент по определенному
индексу
•Clear(): полностью очищает список
16
Cвойство MultiColumn
при значении true позволяет сделать
многоколоночный список, если
элементы не помещаются по длине:
Строковый тип данных является
ссылочным
Тип string является ссылочным, поэтому переменные
этого типа хранят лишь адреса строк. Сами же строки
являются динамическими структурами и размещаются в
памяти уже в процессе выполнения программы. Длина
строки ограничивается размером доступной
оперативной памяти.
Переменная ссылочного типа содержит не данные, а
ссылку на них. Сами данные в этом случае уже хранятся
в куче. Куча - это область памяти, в которой
размещаются управляемые объекты, и работает
сборщик мусора. Сборщик мусора освобождает все
ресурсы и объекты, которые уже не нужны.
Операции явного преобразования для
данных строкового типа
Для всех встроенных типов данных возможно
преобразование их значений в строковое представление, то
есть приведение к строковому типу. Это достигается
использованием метода ToString(). Синтаксис такого
преобразования имеет вид:
.ToString()
Отметим, что хотя этот метод не требует задания каких-либо
параметров при своем вызове, пара круглых скобок после
его имени должна быть указана. Обратное
преобразование из строкового в любой встроенный тип
значения называется также анализом строк. Анализ строки
может быть выполнен с помощью метода Parse(),
определенного для соответствующего типа. Синтаксис
обращения к этому методу имеет вид:
.Parse( )
Тип string не поддерживает ни одного варианта неявного преобразования
string s;
Создание строки
//инициализация отложена
string t = "Это моя строка";
listBox1.Items.Add(t);
//инициализация строковым литералом
string u = new string('*', 20);
//создание строки из 20 звездочек
listBox1.Items.Insert(1,u);
char[] a = ;
//массив для инициализации строки
string v = new string(a);
//создание из массива символов
listBox1.Items.Insert(2, v);
Для строк определены следующие операции:
присваивание (=)
проверка на равенство (==)
проверка на неравенство (!=)
обращение по индексу ([])
сцепление (конкатенация) строк (+)
Пример:
string a = "Текст";
string b = "строки";
string c = a + "
// Результат: Текст
" + b;
строки
Примеры использования методов строк
Конкантенация:
string s1 = "это";
string s2 = "моя";
string s3 = "строка";
string s4 = s1 + " " + s2+" "+s3;
listBox1.Items.Add(s4);
string s5 = String.Concat(s4, "!");
listBox1.Items.Insert(1, s5);
Разделение строк:
string t = "Это моя строка";
string[] Words = t.Split(' ');
listBox1.Items.AddRange(Words);
Примеры использования методов строк
Вставка:
string text = "Хороший день";
listBox1.Items.Add(text);
string subString = "замечательный ";
text = text.Insert(8, subString);
listBox1.Items.Insert(1,text);
Замена:
string text = "хороший день";
text = text.Replace("хороший", "плохой");
listBox1.Items.Add(text);
text = text.Replace("о", "оо");
listBox1.Items.Insert(1, text);
Примеры использования методов строк
Удаление:
string text = "хороший день";
// индекс последнего символа
int ind = text.Length - 1;
// вырезаем последний символ
text = text.Remove(ind);
listBox1.Items.Add(text);
// вырезаем первые два символа
text = text.Remove(0, 2);
listBox1.Items.Insert(1, text);
Класс StringBuilder
При создании строки StringBuilder выделяет памяти
больше, чем необходимо этой строке:
StringBuilder sb = new StringBuilder("Это моя строка");
listBox1.Items.Add(sb);
label1.Text = sb.Length.ToString();
label2.Text = sb.Capacity.ToString();
При создании объекта
StringBuilder выделяется память по
умолчанию для 16 символов, так
как длина начальной строки
меньше 16.
длина строки
емкость выделенной памяти
Класс StringBuilder
Над строками этого класса определены практически те
же операции с той же семантикой, что и над строками
класса String:
• присваивание (=);
• две операции проверки эквивалентности
(= =) и (!=);
• взятие индекса ([]).
Операция конкатенации (+) не определена над строками
класса StringBuilder, ее роль играет метод Append,
дописывающий новую строку в хвост уже существующей.
Со строкой этого класса можно работать как с массивом,
но, в отличие от класса String, здесь уже все делается как
надо: допускается не только чтение отдельного символа,
но и его изменение.
Когда надо использовать класс String,
а когда StringBulder?
Microsoft рекомендует использовать класс String в
следующих случаях:
•При небольшом количестве операций и изменений над
строками
•При выполнении фиксированного количества операций
объединения. В этом случае компилятор может
объединить все операции объединения в одну
•Когда надо выполнять масштабные операции поиска
при построении строки, например IndexOf или StartsWith.
Класс StringBuilder не имеет подобных методов.
Класс StringBuilder рекомендуется использовать в
следующих случаях:
•При неизвестном количестве операций и изменений
над строками во время выполнения программы
•Когда предполагается, что приложению придется
сделать множество подобных операций
Пример: Дана строка символов, состоящая
из произвольного текста на английском
языке, слова разделены пробелами.
Сформировать новую строку, состоящую
из чисел – длин слов в исходной строке.
Исходные данные вводить с помощью
ListBox, строки вводятся на этапе
проектирования формы, используя окно
свойств. Вывод результата организовать в
метку Label.
Чтобы выбрать элемент в ListBox, мы можем использовать метод SetSelect который принимает индекс элемента и истинное или ложное значение, где истинное значение представляет выбираемый элемент. Следующий фрагмент кода устанавливает ListBox, чтобы разрешить множественный выбор, и выбирает второй и третий элементы в списке: listBox1.
Как создать раскрывающийся список на листах?
- Откройте электронную таблицу в Google Таблицах.
- Выберите ячейку или ячейки, в которых вы хотите создать раскрывающийся список.
- Щелкните Данные. .
- Рядом с "Критериями" выберите один из вариантов: .
- В ячейках будет стрелка вниз. .
- Если вы введете данные в ячейку, которая не соответствует элементу в списке, вы увидите предупреждение. .
- Щелкните Сохранить.
Можете ли вы поместить маркированный список в ячейку Excel?
Как вставлять маркеры в Excel с помощью сочетаний клавиш. Самый быстрый способ поместить символ маркера в ячейку: выберите ячейку и нажмите одну из следующих комбинаций с помощью цифровой клавиатуры на клавиатуре. Alt + 7 или Alt + 0149, чтобы вставить сплошную пулю. ? Alt + 9, чтобы вставить пустой маркер.
В чем разница между полем со списком и списком?
Как правило, поле со списком уместно, когда есть список предлагаемых вариантов, и поле со списком подходит, если вы хотите ограничить ввод тем, что находится в списке. Поле со списком содержит поле текстового поля, поэтому варианты, отсутствующие в списке, можно ввести. Исключение составляет случай, когда для свойства DropDownStyle установлено значение DropDownList.
Как создать список в макросе Excel?
Элемент управления ListBox vba позволяет добавлять список с данными на форму. В отличии от комбинированного списка ComboBox, ListBox имеет следующие отличия:
- Тут нельзя вводить собственные значения, а лишь любоваться теми, что были добавлены изначально
- Есть возможность выбирать сразу несколько значений.
Хорошо, прежде чем продолжить, вспоминаем – для запуска редактора VBA служит комбинация клавиш Alt + F11, все элементы управления находятся в окне ToolBox (меню Insert, пункт ToolBox). Вот некоторые свойства для объекта ListBox:
ColumnCount – позволяет задать количество столбиков в списке
ColumnHeads – позволяет задать режим отображения заголовков для колонок: true – заголовки отображаются, false – заголовки не отображаются. Данное свойство актуально при использовании компонента vba ListBox в Exel.
ColumnWidths – свойство определяет ширину колонок, например, “20;30;15”. Как видим, значение строковое, тут мы задали ширину для трех столбиков, если мы зададим ноль, то столбик не будет отображаться.
TextColumn – содержит целое значение, определяющее, содержимое которого столбца должно возвращать свойство Text.
BoundColumn - содержит целое значение, определяющее, содержимое которого столбца должно возвращать свойство Value.
Если для TextColumn и BoundColumn прописать 0, то будет возвращаться номер выбранного значения в списке объекта ListBox VBA языка.
Если вам надо вывести значение для заданного столбика, то надо просто прописать свойство Column задав после него в круглых скобках числовой индекс. Как все это работает, я покажу на примере дальше.
MultiSelect – позволяет определить, как происходит выбор элементов: 0 – fmMultuSelectSingle (только одиночный выбор), 1 - fmMultuSelectMulti (возможность выбирать несколько элементов щелчком мыши или посредством нажатия клавиши “Пробел”), 2 - fmMultuSelectExtended (возможность выбирать несколько элементов посредством нажатия клавиши “Shift”).
VBA Excel ListBox
Теперь надо попрактиковаться, напишем пример использования компонента VBA ListBox в Excel. Но прежде всего, надо заполнить четыре столбика различными данными. Я создал книгу в Excel и заполнил первые четыре столбика такими данными:
- A – первое поле Автомобиль (оно будет служить заголовком), далее следуют марки автомобилей.
- B – первое поле Телефон (оно будет служить заголовком), далее следуют модели телефона Samsung.
- C – первое поле Компьютер (оно будет служить заголовком), далее следуют марки производителей PC.
- D – первое поле Напиток (оно будет служить заголовком), далее следуют марки напитков.
Хорошо, таблицу в Excel мы сделали, теперь можно приступить к работе с проектом. И так, добавьте в проект новый модуль и форму.
Внешний вид формы вы можете увидеть на рисунке. На форме должны быть расположены два элемента управления vba excel ListBox, три элемента TextBox и одна кнопка (CommandButton). Первый список будет содержать четыре столбца, в которых будет отображаться содержимое первых пятидесяти ячеек для A, B, C и D. Второй список будет содержать также все 4 столбика, но отображаться будет только первый. При нажатии на кнопку, произойдет считывание выбранного элемента во втором списке, и в текстовых полях отобразится содержимое для второй, третьей и четвертой колонки.
Чтобы не путать все еще больше, приступим к практике:
Private Sub UserForm_Initialize() With ListBox1 .ColumnHeads = True .ColumnCount = 4 .ColumnWidths = "60;80;60;30" .RowSource = "=A2:D50" .MultiSelect = fmMultiSelectSingle .TextColumn = 1 .BoundColumn = 0 End With With ListBox2 .ColumnHeads = False .ColumnCount = 4 .ColumnWidths = "60;0;0;0" .RowSource = "=A2:D50" .MultiSelect = fmMultiSelectSingle .TextColumn = 0 .BoundColumn = 0 End With End Sub Private Sub CommandButton1_Click() If ListBox2.Value <> "" Then TextBox1.Value = ListBox2.Column(1) TextBox2.Value = ListBox2.Column(2) TextBox3.Value = ListBox2.Column(3) End If End Sub
UserForm_Initialize – настройка данных при инициализации формы (UserForm). Тут происходит настройка свойств для первого и второго объекта ListBox vba языка:
ListBox1 – будет отображаться заголовок, компонент содержит четыре колонки, их ширина: 60;80;60;30. Данные в список будут добавляться из диапазона A2:D50, присутствует возможность выделять только один элемент в списке.
ListBox2 – тут практически все тоже самое, что и для первого списка, только ширина колонок: 60;0;0;0 – то есть, будет отображаться содержимое только первой колонки.
CommandButton1_Click – тут происходит обработка щелчка по кнопке, а именно: происходит проверка, выбрано ли что-то во втором списке (vba excel ListBox), если да, то в первое текстовое поле запишется содержимое из второй колонки, во второе – из третей и в третье – из четвертой.
Спасибо за внимание. Автор блога Владимир Баталий
Есть ListBox с Images. Пользователь выделяет мышкой изображение в ListBox и стрелкой на клавиатуре перемещает вправо по списку (Из Image используется Source текущего элемента для увеличения). В текущей реализации не устанавливает на позицию текущего индекса. При текущем верном индексе устанавливает выделение на +1 от перемещённого изображения, а если задать жестко ContainerFromIndex(3) , то так же устанавливает на +1, на -1 в другую сторону одинаково. Как не видит 0, между +1 и -1.
Этот вариант делает что нужно, только отображается MessageBox, который тут не нужен. Каждый раз отображается и то ли фокус меняется, то ли какое свойство. Не могу понять какое свойство изменяется. Если определить, то можно его вызывать программно без MessageBox.
Эм. А для чего это? Если вам надо чтоб ListBox в ряд размещал изображения, а выделение менялось стрелками вправо и влево, то просто переопределите ему ItemsPanel на и все.
Не изменилось что? Какое поведение вы хотите? Стрелками переключать фокус или именно перемещать позицию элемента в списке? Если первое, то я вам решение сказал, если 2-е, то тут надо немного позаморочится, да. Если что-то другое, то я не понял ваш вопрос.
@EvgeniyZ у меня есть логика перемещения элементов по списку на кнопках. Там всё работает нормально (только там я не определяю ListBoxItem). Здесь нужно сделать то же самое, только на кнопках клавиатуры. Подписываюсь на событие keyDown (StackPanel), получаю текущую кнопку на клавиатуре и пытаюсь перемещать по массиву элемент. Элемент перемещается только один раз, пока есть фокус от мышки, нажатия. После перемещения фокус сбрасывается на нулевой элемент.
Читайте также: