Элемент управления ListBox
Полосы прокрутки
Если не все элементы могут одновременно отобразиться в поле спи- ска, к элементу управления ListBox автоматически добавляется верти- кальная полоса прокрутки.
Если для свойства MultiColumn задано значение true, элементы спи- ска отображаются в нескольких столбцах и появляется горизонтальная полоса прокрутки. Это позволяет отобразить больше позиций списка и устраняет необходимость его вертикальной прокрутки для поиска нуж- ной позиции.
Если для свойства MultiColumn задано значение false, элементы спи- ска отображаются в одном столбце и появляется вертикальная полоса прокрутки.
Если для ScrollAlwaysVisible задано значение true, полоса прокрутки появляется независимо от числа элементов.
Выборка элементов
Свойство SelectionMode определяет, сколько элементов списка можно выбрать одновременно (ничего, одно или несколько: None, One, много- строчный (MultiSimple) или многоколоночный (MultiExtended) ).
Свойство SelectedIndex возвращает целочисленное значение, соот- ветствующее первому выбранному элементу списка.
Выбранный элемент можно изменить программными средствами, из- менив в коде значение SelectedIndex; соответствующий элемент списка будет выделен в форме Windows.
Если не выбран ни один из элементов, свойство SelectedIndex имеет значение -1.
Если выбран первый элемент в списке, значение свойства
SelectedIndex равно 0.
Если выбрано несколько элементов, значение свойства SelectedIndex
отражает выбранный элемент, появляющийся первым в списке.
Свойство SelectedItem аналогично свойству SelectedIndex, но воз- вращает сам элемент, обычно в виде строкового значения.
С помощью методов BeginUpdate() и EndUpdate() можно добавлять к ListBox большое число позиций, причем элемент управления не будет перерисовываться при добавлении к списку каждой новой позиции, пока не будет выполнен метод EndUpdate().
Методы FindString() и FindStringExact() позволяют найти в списке по- зицию, содержащую определенную строку поиска.
Свойства Items, SelectedItems и SelectedIndices предоставляют доступ к трем коллекциям, используемым ListBox.
Свойство Items получает коллекцию позиций элементов управления
ListBox.
public ListBox.ObjectCollection Items {get;}
public class ListBox.ObjectCollection : IList, ICollection, IEnumerable
Свойство SelectedItems получает коллекцию выделенных позиций ЭУ
ListBox.
public ListBox.SelectedObjectCollection SelectedItems {get;}
public class ListBox.SelectedObjectCollection : IList, ICollection, IEnumerable
Свойство SelectedIndices получает коллекцию индексов выделенных позиций ЭУ ListBox.
public ListBox.SelectedIndexCollection SelectedIndices {get;}
public class ListBox.SelectedIndexCollection : IList, ICollection, IEnumerable
Класс коллекции |
Применение в списке |
ListBox.ObjectCollection |
Объединяет все позиции, со- держащиеся в ЭУ ListBox. |
ListBox.SelectedObjectCollection |
Содержит коллекцию выде- ленных позиций, являющуюся подмножеством всех позиций, содержащихся в ListBox. |
ListBox.SelectedIndexCollection |
Содержит коллекцию индек- сов выделенных позиций, яв- ляющееся подмножеством мно- жества индексов ListBox.ObjectCollection. |
В списках хранятся ссылки на объекты!
ListBox.ObjectCollection
ListBox.SelectedObjectCollection ListBox.SelectedIndexCollection
0
1
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 и вызывается оттуда же.
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 ;
Вопрос. Что отображать, а что возвращать в случае выделения стро- ки, если в объекте несколько полей, а отображается только одно?
рис.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; }
}
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";
}
}
}
Пояснения:
Поскольку списки хранят ссылки на объекты, то необходимо приво- дить эту ссылку к типу объекта.
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:
listBox1.DataSource = arrayList;
Для привязки списка к объекту необходимо, чтобы класс объекта реализовывал интерфейс IList. Если этот класс реализует и интерфейс IBindingList, то при обновлении объекта будет автоматически обновлять- ся и список ListBox.
1. В отличие от предыдущего примера, метод ToString() возвращает фамилию.
2. Кроме того, используется свойство
listBox1.ValueMember = "Phone";
которое показывает, значение какого свойства класса PhoneList
должно возвращать свойство SelectedValue: richTextBox1.Text += listBox1.SelectedValue + "\n";
3. Так как listBox1.DataSource = arrayList порождает событие Select- edIndexChanged с выборкой первого элемента, то вместо обработчика событий 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";
}
рис.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);
Чтобы удалить элемент
// Удалить с индексом 0:
comboBox1.Items.RemoveAt(0);
// Удалить выделенный элемент:
comboBox1.Items.Remove(comboBox1.SelectedItem);
// Удалить элемент "Tokyo":
comboBox1.Items.Remove("Tokyo");
// Удалить все элементы
listBox1.Items.Clear();
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.