Элемент управления 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. |
В списках хранятся ссылки на объекты!
рис.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 порождает событие 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";
}
рис.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();
Дата добавления: 2019-02-08; просмотров: 862;