На этом шаге мы рассмотрим некоторые свойства этого компонента.
Перечень свойств компонента, отображенных в окне Properties (Свойства), показан на рисунке 1.
Рис.1. Свойства компонента ListBox
Уточним смысл некоторых свойств.
- ColumnWidth - задает ширину колонки списка при многоколоночном списке.
- DataSource - задает источник данных, с помощью которого можно заполнять список (в данной версии источник данных отключен).
Существуют два способа:- использовать метод Add() - в этом случае свойство DataSource должно быть отключено;
- подключаться к различным источникам данных, доступ к которым формируется через диалоговое окно, открывающееся кнопкой,
расположенной в поле этого свойства (рисунок 2).
Рис.2. Диалоговое окно для задания источника данных
Примечание.
В данной версии эта возможность отключена, поэтому диалоговое окно на рисунке 2 пустое! - Items - это элементы компонента, которые можно не только просматривать, но и изменять. Для задания списка
строк-элементов надо щелкнуть на кнопке с многоточием в поле этого свойства, чтобы открылось окно редактора, позволяющего
вводить и редактировать строки (рисунок 3).
Рис.3. Окно редактора для ввода строк в компонент ListBox
Извлечь строки из компонента можно так:String^ it = listBox1->Items[i]->ToString();
где i - это номер строки (начинается с нуля).
Обнаружить строку, на которой был щелчок мыши (обработка события Click), можно так:String^ it = this->listBoxl->Items[this->listBoxl->SelectedIndex]->ToString();
где SelectedIndex - индекс выбранной строки.
- MultiColumn - обеспечивает компоненту работу в многоколоночном режиме (т. е. набор строк, не
помещающийся в окно, будет размещаться новых колонках). Вид ListBox в одноколоночном и многоколоночном режимах показан на рисунке 4.
Рис.4. Вид компонента ListBox в одноколоночном и многоколоночном режимах
Приведем пример использования этого свойства.
// Одноколоночный режим private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { this->listBox1->Items->Clear(); //очистка компонента String^ it; listBox1->MultiColumn = false; //одноколоночный режим for (int i = 0; i < 50; i++) { it = Convert::ToString(i); //так преобразуется int to String it = it->Concat("Items_", it); listBox1->Items->Add(it); } } // Многоколоночный режим private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { this->listBox1->Items->Clear(); for ( int x = 0; x < 50; x++ ) { String^ it = Convert::ToString(x); //так преобразуется int to String it = it->Concat("Items_", it); listBox1->Items->Add(it); } listBox1->MultiColumn = true; //многоколоночный режим listBox1->ColumnWidth = 50; //это ширина колонки в пикселях // Чтобы автоматически выводить любой текст в многоколоночном варианте // надо уметь рассчитать максимальную длину строки в пикселях, // т. е. уметь переводить символы в пиксели. }
Архив проекта можно взять здесь.
Результат работы приложения изображен на рисунке 5.
Рис.5. Результат работы приложения
Определение максимальной ширины строки в пикселях для нашего примера:
int width = (int)listBox1->CreateGraphics()->MeasureString( listBox1->Items[listBox1->Items->Count - l]->ToString(), listBox1->Font).Width; listBox1->ColumnWidth = width;
Пояснение:
Метод CreateGraphics() создает графический объект для listBox1 (выбор строк происходит в графике).
У этого объекта есть метод MeasureString(String,Font), который измеряет длину строки в пикселях, выводимую данным шрифтом (разные шрифты
занимают на экране разное количество пикселей).
Параметр String - это:
listBox1->Items[listBox1->Items->Count - 1]->ToString()
для нашего примера это последний (самый длинный) элемент.
i-й элемент извлекается так:
String ^it=listBoxl->Items[i]->ToString();
Параметр Font - это:
listBox1->Font
Метод MeasureString(String, Font) возвращает данные по структуре типа sizeF, которая состоит из 2-х элементов типа float. Это координаты прямоугольника (в пикселях),
куда помещается изображение строки на экране. Haм надо знать ширину этого прямоугольника, т. к. она определяет размер строки в пикселях. Поэтому мы пишем:
MeasureString(String,Font).width,
беря из структуры только один элемент.
Но поскольку этот элемент имеет тип float, то его надо перевести в int, потому что ширина в ListBox задается в int.
Поэтому перед ListBox1->CreateGraphics() стоит (int) - принудительный перевод float в int.
В общем случае надо определять строку максимальной длины, образуя цикл:
String^ it; String^ it_0; // здесь будет предыдущая строка it_0=listBoxl->Items[0]->ToString(); for(int i=0; i < listBox1->Items->Count; i++) { it=listBoxl->Items[i]->ToString(); // и далее сравнивать текущую и предыдущую строки, // применяя метод сравнения для строк типа String^ и выбирая из них большую. }
На следующем шаге мы рассмотрим, как использовать этот компонент.