Компоненты Windows Forms. Свойства ListBox

   
На этом шаге мы рассмотрим некоторые свойства этого компонента.

   
Перечень свойств компонента, отображенных в окне 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^ и выбирая из них большую.
  }

   
На следующем шаге мы рассмотрим, как использовать этот компонент.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий