На этом шаге мы рассмотрим назначение и использование этого компонента.
Компонент находится в списке All Windows Forms (Все формы Windows Forms) палитры компонентов. Компонент CheckedListBox является расширением ListBox. Он делает почти все, что делает ListBox, но дополнительно выводит окна контроля (флажки-переключатели), в которых можно делать отметку галочкой. Вид компонента показан на рисунке 1.
Рис.1. Вид компонента CheckedListBox, помещенного в форму
Пользователь может помечать элементы списка, щелкая мышью на одной или нескольких позициях (устанавливать флажок). Повторный щелчок снимает включение флажка. Выбор элемента списка еще не означает, что флажок устанавливается/снимается. Существует свойство CheckOnClick, которое разрешает/запрещает делать пометку (устанавливать/снимать флажок). Если это свойство установлено в False, то при щелчке мышью на позиции галочка (флажок) в ней не появится. Но одновременно со щелчком на позиции идет подсветка строки. Если повторно щелкнуть на отмеченной строке, то галочка появится. Таким образом, при значении свойства CheckOnClick, установленным в False, для включения флажка надо сначала отметить элемент списка (щелчком на строке), потом сделать повторный щелчок.
А выключается флажок при щелчке на строке или на нем самом.
Если же CheckOnClick установлено в True, то флажок включается одновременно с выбором элемента (и выключается при повторном щелчке на нем).
Существует свойство ThreeDCheckBoxes, которое определяет стиль окна флажка (будет ли оно в стиле Flat или Normal). Если значение свойства равно True, то стиль Flat, иначе - Normal.
Перечень свойств компонента, отображенных в его окне Properties (Свойства), показан на рисунке 2.
Рис.2. Свойства компонента CheckedListBox
Компонент CheckedListBox поддерживает три состояния флажка:
Такое состояние можно устанавливать только в режиме исполнения, т. е. программно (т. к. этого механизма выполнения в режиме дизайна нет).
Существуют методы CheckedListBox, с помощью которых можно определять и устанавливать состояние флажка:
Приведем пример задания состояния флажков и определения их состояния. Текст обработчика события DoubleClick компонента CheckedListBox приведен ниже, а результат - на рисунке 3.
private: System::Void checkedListBox1_DoubleClick(System::Object^ sender, System::EventArgs^ e) { checkedListBox1->SetItemCheckState(0, CheckState::Checked); checkedListBox1->SetItemCheckState(1, CheckState::Unchecked); checkedListBox1->SetItemCheckState(2, CheckState::Indeterminate); int i = (int)checkedListBox1->GetItemCheckState(0); }
Рис.3. Программная установка флажков
Пояснение: Здесь задаются состояния для флажков 1, 2 и 3-й строк. Последний оператор определяет состояние 1-й строки. Так как тип результата, выдаваемого методом GetItemCheckState(), - это тип CheckState, то чтобы увидеть состояние, надо этот тип привести к типу int принудительно. Поэтому после знака присваивания стоит (int).
Чтобы узнать, помечен ли элемент списка, можно выполнить оператор:
bool b = this->checkedListBox1->GetItemChecked(i);
Результат метода GetItemChecked() - логическая переменная, i - индекс элемента.
Можно и другим способом установить флажок. Для этого следует выполнить оператор:
this->checkedListBox1->SetItemChecked(3, 1);
Здесь:
Обратим внимание на событие ItemCheck, которое возникает, когда состояние флажка меняется. Оно пригодится при обработке выборки из CneckedListBox.
В CheckedListBox можно также загружать текстовые строки из файла, как для ListBox. Пример такой загрузки показан на рисунке 4. Фрагменты текста программы - в примере ниже.
. . . . #include <stdio.h> namespace My167_1 { . . . . private: /// <summary> // функция: загружает из файла текстовые строки в CheckedListBox void LoadFromFile(char *File, CheckedListBox ^lb) { char s[300]; FILE *fp; lb->Items->Clear(); if (!(fp=fopen(File, "r"))) { MessageBox::Show("Ошибка открытия файла", "Работа с CheckedListBox", MessageBoxButtons::OK, MessageBoxIcon::Asterisk); return; } fgets(s, 300, fp); while(!feof(fp)) { String ^dd = gcnew String(s); // этот способ конвертирования не удаляет последний // управляющий символ, который надо удалить: int j = dd->Length-1; dd = dd->Substring(0, j); lb->Items->Add(dd); fgets(s,300,fp); } } /// Требуется переменная конструктора. . . . . // Выход private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { Close(); } // Загрузка из файла private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { LoadFromFile("d:\\file.txt", this->checkedListBox1); }
Рис.4. Пример загрузки текстового файла в CheckedListBox
На следующем шаге мы рассмотрим пример использования этого компонента.