Урок из серии: «Программирование на Visual Basic.NET для школьников»
На этом уроке будет рассмотрен элемент управления Windows Forms CheckedListBox. Он является расширением элемента управления ListBox (Список). Выполняет практически все его функции, а кроме того, в нем может отображаться галочка рядом с элементами списка.
В ходе построения проекта мы создадим компьютерную версию одной из простых головоломок Самуэля Лойда. Лойд – известный американский автор головоломок и шахматных задач – жил и работал во второй половине XIX и в начале XX века.
В этой головоломке используется список флажков и ещё один дополнительный обыкновенный список. Мы научимся обрабатывать помеченные пользователем элементы в списке флажков CheckedListBox, заодно закрепим свои знания по работе с обыкновенным списком ListBox.
Краткая справочная информация
В элементе управления CheckedListBox элементы списка можно выделять цветом, кроме того их можно помечать галочкой.
В отличии от обычного списка, выделить в списке можно только один элемент. Помеченных галочкой элементов может быть несколько.
Выделенный элемент не обязательно должен быть помеченным элементом. За то, следует ли переключать флажок, когда выделяется элемент, отвечает свойство CheckOnClick. По умолчанию свойство имеет значение False и при выделении элемента флажок не переключается. В этом случае, чтобы переключить флажок, нужно выполнить щелчок в области флажка.
Проект «Головоломка «
Головоломка, которую мы решаем. Из заданного набора чисел надо выбрать те, сумма которых составит 50. Числа такие:
25, 27, 3, 12, 6, 15, 9, 30. 21. 19.
Несмотря на кажущуюся простоту, головоломка может доставить немало хлопот.
Какие элементы управления нам понадобятся?
Во-первых, мы используем список флажков. Он похож на обычный список, но возле каждого пункта имеется флажок. Его можно установить или сбросить.
Еще нам понадобится обычный список, без флажков. В него мы поместим выбранные числа. Сумму этих чисел покажем в виде надписи. Окно нашей программы должно выглядеть примерно так, как показано на рисунке.
Технология выполнения
-
- Запустите систему Visual Basic и создайте новый проект под именем Головоломка.
- Установите на форме элементы управления в соответствии с образцом. Мы уже решили, что нам нужны три элемента управления: список флажков (CheckedListBox), простой список (ListBox) и надпись (Label).
- Настройте свойства объектов в соответствии с таблицей:
Объект Свойства Значения Примечание Form1 Text «Головоломка» CheckedListBox Text пусто Items 25, 27, 3, 12, 6, 15, 9, 30, 21, 19 Щелкните в значении свойства Items (Коллекция), на многоточии, появится окно Редактор коллекции строк. Введите числа по одному в строке. ListBox1 Text Пусто Label Text «Сумма: 0» Начальное значение суммы выбранных чисел (пока ничего не выбрано). Alignment MiddleCenter Выравнивание
по центруОкно программы готово и можно приступить к программированию.
- Установка и сброс флажков. В окне программы только один элемент управления способен к диалогу – это список флажков. Программа должна что-то делать только в том случае, если дин из флажков устанавливается или сбрасывается. В этом случае возникает событие ItemCheck (Пометка пункта). Нам надо описать реакцию на него.
- Щелкните на списке флажков правой кнопкой мыши. Выберите в открывшемся контекстном меню пункт View Code (Просмотреть код)
- В окне кода выберите в раскрывающемся списке справа событие ItemCheck (Пометка пункта). Система Visual Basic выдаст заготовку процедуры для обработки этого события.
CheckedListBox1_ItemCheck(ByVal sender As Object, ByVal e As
System.Windows.Forms.ItemCheckEventArgs)
Информация о пункте списка, для которого был установлен флажок, передается через параметр процедур
ByVal e As System.Windows.Forms.ItemCheckEventArgs.
Состояние флажка после изменения состояния флажка хранится в свойстве e.NewValue (Новое значение). Индекс измененной записи хранится в свойстве e.Index.
- Описываем переменные, которые будут использоваться в программном коде:
Dim i, s As Integer
Здесь: S — сумма выбранных чисел, i — переменная цикла.
- Теперь нам нужно выяснить, установлен был флажок или сброшен. Оператор проверки состояния флажка должен выглядеть так:
If e.NewValue = CheckState.Checked Then
- Процедура обработки события вызывается уже после того, как состояние флажка изменилось.
Если условие истинно (флажок был только что установлен), то мы должны добавить во второй список новый пункт. Это делается при помощи метода Add. Его параметр — содержимое добавляемого пункта. Нужный нам оператор такой:ListBox1.Items.Add(CheckedListBox1.Items(e.Index))
- Если флажок сброшен, нам будет чуть труднее. Надо удалить пункт из второго списка, а мы не знаем, где именно он находится. Поэтому нам придеться перебрать все элементы второго списка и сравнить его с текущим элементом первого списка. Для этого нам понадобится цикл, выполняющий перебор.Число элементов в списке задается свойством ListCount.Нужные операторы будут выглядеть следующим образом:
For i = 0 To ListBox1.Items.Count - 1 If ListBox1.Items(i) = CheckedListBox1.Items(e.Index) Then ListBox1.Items.RemoveAt(i) Exit For End If Next i End If
Из значения свойства ListCount мы вычли единичку потому, что нумерация элементов массива ведется не с единицы, а с нуля.
Если условие ListBox1.Items(i) = CheckedListBox1.Items(e.Index) истинно, значит, нужный элемент найден. Его номер совпадает с текущим значением переменной i.
В этом случае надо удалить этот элемент из списка. Это делается при помощи метода RemoveItem. - Теперь наша программа умеет правильно реагировать на установку или сброс флажка в списке.
- Обновление суммы. Итак, списки обновлены. Теперь надо заново подсчитать сумму выбранных чисел. Здесь нас ждет небольшой подводный камень. Хотя элементы списка выглядят как числа, они, на самом деле, являются текстовыми строками. Поэтому при суммировании нам придется воспользоваться функцией Val().Это тоже удобно сделать в цикле. Пусть сумма накапливается в переменной S. Ее расчет можно выполнить так:
s = 0 For i = 0 To ListBox1.Items.Count - 1 s = s + Val(ListBox1.Items(i)) Next i
- Чтобы представить вычисленную сумму в поле надписи , она должна быть текстовой строкой. Поэтому преобразовали ее в текстовый тип с помощью функции STR(). Присоединим ее к тексту подсказки с помощью операции слияния строк:
Label1.Text = "Сумма: " + Str(s)
- Проверка решения. Осталось сделать последний шаг: проверить, решена ли головоломка. Так как значение суммы выбранных чисел у нас уже есть, надо сравнить его с заданным числом 50:
If S = 50 Then
- Если головоломка еще не решена, делать ничего не надо и решение можно продолжить. Если же решение найдено, давайте отключим все элементы управления (изменим свойство Enabled) Кроме того, выведем в поле надписи сообщение «Победа». Это можно сделать так:
If s = 50 Then Label1.Text = "Победа: " + Str(s) ListBox1.Enabled = False CheckedListBox1.Enabled = False End If
- Программа готова. На этом наша программа готова, и ее можно испытать. Полный ее текст, как он виден в окне кода, написан ниже.
Private Sub CheckedListBox1_ItemCheck(ByVal sender As Object, ByVal e As
System.Windows.Forms.ItemCheckEventArgs) Handles heckedListBox1.ItemCheck Dim i, s As Integer If e.NewValue = CheckState.Checked Then ListBox1.Items.Add(CheckedListBox1.Items(e.Index)) Else For i = 0 To ListBox1.Items.Count - 1 If ListBox1.Items(i) = CheckedListBox1.Items(e.Index) Then ListBox1.Items.RemoveAt(i) Exit For End If Next i End If s = 0 For i = 0 To ListBox1.Items.Count - 1 s = s + Val(ListBox1.Items(i)) Next i Label1.Text = "Сумма: " + Str(s) If s = 50 Then Label1.Text = "Победа: " + Str(s) ListBox1.Enabled = False CheckedListBox1.Enabled = False End If End Sub
- Нажмите клавишу F5, чтобы запустить программу. При установке флажков выбранные числа попадают во второй список, а при сбросе – удаляются из него.
- Когда программа заработает, попробуйте решить головоломку. Это далеко не самая сложная из головоломок Лойда. На всякий случай примите подсказку: чтобы получить сумму 50, надо выбрать три числа.
В этом уроке мы познакомились с элементом управления CheckedListBox (Список флажков), узнали, как обрабатывать в программном коде установку флажков пользователем. Поработали с обычным списком без флажков ListBox, производили в нем поиск, добавление и удаление записей, суммирование записей.
До встречи в следующем уроке.
интересная задача, спасибо за полное разъяснение кода и за решение! Обязательно применю на своих уроках.