Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lec

.pdf
Скачиваний:
25
Добавлен:
24.03.2015
Размер:
3.43 Mб
Скачать

Items

ListBox.ObjectCollection

SelectedItems

 

SelectedIndices

 

 

 

Элемент

ListBox.SelectedObjectCollection ListBox.SelectedIndexCollection

Элемент

Элемент

Элемент

1

0

Элемент

Элемент

3

1

Элемент

Элемент

5

2

Элемент

Ссылки

 

 

Ссылки

 

 

 

Весь список

Выделенные

Индексы выделенных

элементы

элементов

 

рис.10

Свойство Items.Count отражает число элементов в списке.

Это значение всегда на единицу больше максимально возможного значения свойства SelectedIndex, поскольку для свойства SelectedIndex индексация ведется от нуля.

Чтобы добавить или удалить элементы в список ListBox, используйте методы Items.Add(), Items.Insert(), Items.Clear() или Items.Remove().

Кроме того, можно добавить элементы в список с помощью свойства Items во время разработки.

Метод Add() может принимать любой объект при добавлении элементов в ListBox. Для отображения объекта в ListBox элемент управления использует текст, возврвщаемый методом ToString() объекта, если только имя элемента в объекте не было указано в свойстве DisplayMember.

Кроме добавления позиций с помощью метода Add() класса ListBox.ObjectCollection, добавлять их можно также с помощью свойства

DataSource класса ListControl (см. ниже).

Пример 1 В следующем примере показан способ создания элемента управления

ListBox, отображающего несколько позиций в столбцах. При этом в списке элемента управления может быть выбрано более одной позиции. Код, приведенный в примере, добавляет 50 позиций в ListBox с помощью метода Add класса ListBox.ObjectCollection, а затем выбирает три позиции из списка с помощью метода SetSelected. Затем отображаются значения из коллекций ListBox.SelectedObjectCollection (с помощью свойства SelectedItems) и ListBox.SelectedIndexCollection (с помощью свойства

SelectedIndices). В примере предполагается, что код расположен в Form и вызывается оттуда же.

321

listBox1.SelectionMode = SelectionMode.MultiSimple; //в конструкторе VS

private void button1_Click (object sender, EventArgs e)

{

 

 

listBox1.BeginUpdate();

 

// Начать добавление элементов.

for ( int x = 1; x <= 20; x++)

// Цикл добавления 50 элементов

{

 

 

listBox1.Items.Add ("Элемент " + x);

}

 

 

listBox1.EndUpdate();

// Высветить обновленный список

// Выделить три элемента с индексами 1, 3 и 5 listBox1.SetSelected (1, true); listBox1.SetSelected (3, true); listBox1.SetSelected (5, true);

//Отобразить второй выделенный элемент [1] и индекс первого [0] richTextBox1.Text = listBox1.SelectedItems[1] + "\n"; richTextBox1.Text += listBox1.SelectedIndices[0];

}

SetSelected() - выделяет указанную позицию в ListBox или снимает с нее выделение.

Не забудьте разрешить множественное выделение элементов.

Пример 2

Создание ListBox из объектов класса PhoneList, имеющих поля string name, phone ;

Вопрос. Что отображать, а что возвращать в случае выделения строки, если в объекте несколько полей, а отображается только одно?

322

рис.11

Список отображает строки, которые определяет свойство DisplayMember. Если это свойство не использовать, то будут отображаться строки, возвращаемые методом ToString(). В примере он возвращает номер телефона.

Примечание. Свойство DisplayMember должно получать в качестве значения строку с именем открытого свойства, а не с именем открытого поля. Если вместо свойства использовать открытое поле, то данная возможность работать не будет.

Свойство SelectedItem возвращает ссылку на объект, соответствующий выбранному значению. Используя эту ссылку, можно получить доступ ко всем открытым членам объекта.

using System;

using System.Collections.Generic; using System.Text;

namespace Ctrl_ListBox

{

class PhoneList

{

string name, phone ;

public PhoneList (string n, string p)

{

name = n; phone = p;

}

public string Name

{

get { return name; }

}

323

public string Phone

{

get { return phone; }

}

public override string ToString()

{

return Phone;

}

}

}

private void button1_Click(object sender, EventArgs e)

{

listBox1.Items.Clear(); listBox1.DisplayMember = "Name";

listBox1.BeginUpdate();

// Отображаются строки, указанные в свойстве DisplayMember listBox1.Items.Add (new PhoneList ("Иванов", "123-45-67")); listBox1.Items.Add (new PhoneList ("Петров", "223-45-68")); listBox1.Items.Add (new PhoneList ("Сидоров", "323-45-69")); listBox1.Items.Add (new PhoneList ("Кузнецов", "423-45-00")); listBox1.Items.Add (new PhoneList ("Рыбаков", "523-55-67")); listBox1.Items.Add (new PhoneList ("Климов", "623-66-67")); listBox1.Items.Add (new PhoneList ("Трушин", "723-77-67")); listBox1.Items.Add (new PhoneList ("Зверев", "823-88-67")); listBox1.Items.Add (new PhoneList ("Иванова", "923-99-67")); listBox1.EndUpdate();

}

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)

{

PhoneList obj;

obj = (PhoneList) listBox1.SelectedItem;

richTextBox1.Text = obj.Name + "\n" ; richTextBox1.Text += obj.Phone + "\n\n " ;

//Выводится строка, возвращаемая методом ToString(), т.е. Phone. richTextBox1.Text += listBox1.SelectedItem.ToString() + "\n";

richTextBox1.Text += listBox1.SelectedIndex.ToString() + "\n";

//Следующий фрагмент не работает, так как не используется

//свойство DataSource

//listBox1.ValueMember = "Phone";

//richTextBox1.Text = listBox1.SelectedValue + "\n";

}

}

}

324

Пояснения:

Поскольку списки хранят ссылки на объекты, то необходимо приводить эту ссылку к типу объекта.

obj = (PhoneList) listBox1.SelectedItem;

ToString() можно не указывать, если значение участвует в операции со строками: +=, +.

Пример 3 В следующем примере вместо

listBox1.DisplayMember = "Name";

использовано

listBox1.DisplayMember = "Phone";

рис.12

Определение источника данных для ЭУ ListBox или ComboBox

Как быть, если данные для списка уже существуют в виде массива или таблицы?

Для элементов управления ListBox и ComboBox можно выполнить привязку к данным.

Чаще всего эти элементы управления используются для поиска сведений в базе данных, ввода новых данных или редактирования существующих.

DataSource - возвращает или задает источник данных для этого

ListControl.

ValueMember - возвращает или задает строку, указывающую свойство источника данных, значение которого извлекается.

SelectedValue - возвращает или задает значение свойства, определенного свойством ValueMember.

В следующем примере используется связывание ЭУ ListBox с динамическим массивом ArrayList с помощью свойства DataSource:

325

listBox1.DataSource = arrayList;

Для привязки списка к объекту необходимо, чтобы класс объекта реализовывал интерфейс IList. Если этот класс реализует и интерфейс IBindingList, то при обновлении объекта будет автоматически обновляться и список ListBox.

1.В отличие от предыдущего примера, метод ToString() возвращает фамилию.

2.Кроме того, используется свойство

listBox1.ValueMember = "Phone";

которое показывает, значение какого свойства класса PhoneList должно возвращать свойство SelectedValue:

richTextBox1.Text += listBox1.SelectedValue + "\n";

3. Так как listBox1.DataSource = arrayList порождает событие SelectedIndexChanged с выборкой первого элемента, то вместо обработчика событий listBox1_SelectedIndexChanged используется listBox1_Click.

private void button1_Click(object sender, EventArgs e)

{

listBox1.DataSource = null; //для повторения

ArrayList arrayList = new ArrayList();

arrayList.Add (new PhoneList ("Иванов", "123-45-67")); arrayList.Add (new PhoneList ("Петров", "223-45-68")); arrayList.Add (new PhoneList ("Сидоров", "323-45-69")); arrayList.Add (new PhoneList ("Кузнецов", "423-45-00")); arrayList.Add (new PhoneList ("Рыбаков", "523-55-67")); arrayList.Add (new PhoneList ("Климов", "623-66-67")); arrayList.Add (new PhoneList ("Трушин", "723-77-67")); arrayList.Add (new PhoneList ("Зверев", "823-88-67")); arrayList.Add (new PhoneList ("Иванова", "923-99-67"));

listBox1.Items.Clear(); listBox1.DataSource = arrayList;

listBox1.DisplayMember = "Name";

}

private void listBox1_Click (object sender, EventArgs e)

{

PhoneList obj;

obj = (PhoneList)listBox1.SelectedItem; richTextBox1.Text = obj.Name + " "; richTextBox1.Text += obj.Phone + "\n\n";

richTextBox1.Text += listBox1.SelectedItem + "\n"; //исп.ToString() richTextBox1.Text += listBox1.SelectedIndex + "\n"; //исп.ToString()

listBox1.ValueMember = "Phone"; richTextBox1.Text += listBox1.SelectedValue + "\n";

}

326

 

 

DisplayMember = "Name"

 

 

объекты

 

 

arrayList

PhoneList

ListBox

Форма

 

 

Name

 

Nam

 

 

ValueMember = "Phone"

 

DataSource = arrayList

 

 

SelectedValue

рис.13

Элементы управления Windows Forms не выполняют сортировку, если они привязаны к данным. Чтобы вывести отсортированные данные, используйте источник данных, поддерживающий сортировку данных, и выполните ее с его помощью.

Чтобы получить доступ к определенному элементу

comboBox1.Items[i].ToString();

Чтобы добавить элементы

//Добавить в конец comboBox1.Items.Add ("Tokyo");

//Вставить с индексом 0: checkedListBox1.Items.Insert (0, "Copenhagen");

//Присвоить коллекции Items полный массив: object[] ItemObject = new object[10];

for (int i = 0; i <= 9; i++) ItemObject[i] = "Item" + i;

listBox1.Items.AddRange(ItemObject);

Чтобы удалить элемент

327

//Удалить с индексом 0: comboBox1.Items.RemoveAt(0);

//Удалить выделенный элемент: comboBox1.Items.Remove(comboBox1.SelectedItem);

//Удалить элемент "Tokyo": comboBox1.Items.Remove("Tokyo");

//Удалить все элементы listBox1.Items.Clear();

Особенности элемента управления ComboBox

Как правило, поле со списком используется при наличии списка возможных вариантов, а список — при необходимости ограничить данные, вводимые в список.

Поле со списком содержит текстовое поле, поэтому варианты, отсутствующие в списке, можно вводить, если это не запрещено свойством

DropDownStyle.

Свойство DropDownStyle определяет стиль отображения поля со списком:

● DropDown – в поле ввода можно вводить новые значения. Полный список не отображается, пока пользователь не щелкнет кнопку со стрелкой вниз.

DropDownList - в поле ввода нельзя вводить новые значения. Используется навигация по первой букве.

Simple – в поле ввода можно вводить новые значения, окно списка постоянно открыто.

Пример формирования списка на базе его текстового поля:

if (comboBox1.FindStringExact ( comboBox1.Text) == -1 )

comboBox1.Items.Add ( comboBox1.Text );

FindStringExact() – полное совпадение со строкой; FindString() – совпадение подстрок (поиск вхождений);

Особенности ЭУ CheckedListBox

CheckedListBox позволяет:

либо просмотреть коллекцию помеченных элементов, сохранен-

ную в свойстве CheckedItems,

либо пройти по списку с помощью метода GetItemChecked, чтобы определить, какие элементы помечены.

Метод GetItemChecked принимает номер элемента в качестве аргумента и возвращает значение true или false.

328

Свойства SelectedItems и SelectedIndices не определяют помеченные элементы: они определяют, какие элементы выделены.

Вывод помеченных элементов Пример 1

Пройдите по коллекции CheckedItems помеченных элементов, начав с 0, поскольку нумерация коллекции начинается с нуля. Обратите внимание, что этот метод выдаст номер элемента в списке помеченных элементов, а не в полном списке.

Если первый элемент списка не помечен, но помечен второй, в приведенном ниже коде отобразится текст наподобие следующего: "Помеченный элемент 1 = ЭлементСписка2".

if ( checkedListBox1.CheckedItems.Count != 0 )

{

string s = "";

for ( int x = 0; x < checkedListBox1.CheckedItems.Count ; x++)

{

s = s + "\nПомеченный элемент " + (x+1) + " = "

+ checkedListBox1.CheckedItems[x];

}

MessageBox.Show (s);

}

Пример 2

Пройдите по коллекции Items всех элементов списка, начав с 0, поскольку нумерация коллекции начинается с нуля, и вызовите метод GetItemChecked() для каждого элемента. Обратите внимание, что этот метод выдаст номер элемента в полном списке; поэтому если первый элемент списка не помечен, но помечен второй, будет выведен текст наподобие следующего: "Помеченный элемент 2 = ЭлементСписка2".

string s = "Отмеченые элементы:\n" ;

for ( int i = 0; i < checkedListBox1.Items.Count ; i++ )

{

if ( checkedListBox1.GetItemChecked(i) == true)

s = s + "\nПомеченный элемент " + (i+1) + " = " + checkedListBox1.Items[i] ;

}

MessageBox.Show (s);

4. DomainUpDown

Элемент управления DomainUpDown отображает отдельное строковое значение, выделенное в коллекции Object путем нажатия на кнопки передвижения вверх/вниз по элементам коллекции.

329

рис.14

Пользователь также может вводить в элемент управления текст, если свойство ReadOnly имеет значение false (вводимая строка должна соответствовать элементу в коллекции, чтобы быть допустимой).

Доступ к элементам коллекции:

Вся коллекция объектов доступна через свойство Items.

Свойство SelectedIndex - получает или задает значение индекса для выделенного элемента.

Свойство SelectedItem - получает или задает текстовое представление выделенного элемента, основываясь на значении индекса элемента, выделенного в коллекции.

Пример:

MessageBox.Show ( "SelectedIndex: " + domainUpDown1.SelectedIndex + "\n" + "SelectedItem: " + domainUpDown1.SelectedItem);

Создать коллекцию объектов, отображаемых в элементе управления

DomainUpDown, можно:

● в коде программы (можно добавлять и удалять отдельные элемен-

ты с помощью методов Items.Add() и Items.Remove() )

--или --

на этапе конструирования (с помощью Редактора строк коллекции, вызываемого через свойство Items ... ).

рис.15

// domainUpDown1. В конструкторе. Создаем коллекцию объектов-строк

330

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]