- •Лабораторная работа №4 работа со списками в windows-приложениях Работа со списками в ListBox
- •Операции над списками ListBox
- •Добавление строк в ListBox
- •Доступ к строкам в ListBox
- •Удаление пунктов из списка
- •Изменяем цвет и шрифт пунктов списка
- •Загрузка ListBox из файлов
- •Работа со списками в ComboBox Основные свойства ComboBox
- •Операции над списками в ComboBox Добавление строк в ComboBox
- •Доступ к строкам в ComboBox
- •Изменяем цвет пунктов списка
- •Загрузка ComboBox из файлов
- •Возможности выделения в ListBox и ComboBox
- •Особенности использования контрола CheckedListBox
- •Задание к лабораторной работе.
Удаление пунктов из списка
Для удаления пунктов из списка можно воспользоваться одним из следующих способов:
1.
try
{
listBox1.Items.RemoveAt(0);
}
catch
{
}
2.
listBox1.Items.Remove(listBox1.SelectedItem);
3.
listBox1.Items.Remove("Неудовлетворительно");
Возможность удаления повторяющихся строк можно продемонстрировать на кодах следующих обработчиков:
//Данный код создает повторяющиеся пункты списка ("Хорошо").
private void toolStripButton1_Click(object sender, EventArgs e)
{
string[] sArayItems = {"Отлично", "Хорошо","Хорошо",
"Удовлетворительно","Неудовлетворительно"};
listBox1.Items.Clear();
for (int i = 0;i < sArayItems.GetLength(0);i++)
{
listBox1.Items.Add(sArayItems[i]);
}
}
//Этот код убирает все пункты списка, которые выделены,
//в том числе и если есть повторения:
private void toolStripButton2_Click(object sender, EventArgs e)
{
string sSelString = (string) listBox1.SelectedItem;
int index = -1;
index = listBox1.FindStringExact(sSelString);
while(index != -1)
{
listBox1.Items.RemoveAt(index);
try
{
index = listBox1.FindStringExact(sSelString,index);
}
catch
{
index=-1;
}
}
}
Изменяем цвет и шрифт пунктов списка
Для изменения цвета пунктов контрола воспользуемся изменением цвета при их отрисовке. Для этого установим свойство DrawMode ListBox в OwnerDrawFixed. После этого создадим обработчик события DrawItem для ListBox и поместим туда следующий код:
private void listBox1_DrawItem(object sender,
System.Windows.Forms.DrawItemEventArgs e)
{
listBox1.DrawMode = DrawMode.OwnerDrawFixed;
//Cтираем все перерисовкой фона
e.DrawBackground();
//Создем кисть с черным цветом
//Если пунтов более 4х - она будет кистью по умолчанию
Brush brush = Brushes.Black;
//При перерисовке пункта задаем цвет кисти
switch (e.Index)
{
case 0:
brush = Brushes.Red;
break;
case 1:
brush = Brushes.Orange;
break;
case 2:
brush = Brushes.Purple;
break;
case 3:
brush = Brushes.Blue;
break;
}
// Выводим конкретный пункт
e.Graphics.DrawString(listBox1.Items[e.Index].ToString(),
e.Font,brush,e.Bounds,StringFormat.GenericDefault);
//Если ListBox в фокусе выбирается данный пункт
e.DrawFocusRectangle();
}
Для просмотра результата (Рис. 2) запустите приложение.
Рис.2. Изменения цвета пунктов списков
Изменения шрифта потребует дополнительных затрат, связанных с тем, что это изменение ведет к изменению размеров ячейки поля окна для пункта списка и, как результат, Windows каким то образом должен быть оповещен, где и какой пункт списка будет отрисован в окне. Для этого, помимо обработчика события DrawItem, необходимо создать обработчик события MeasureItem. Код обработчика события нажатия кнопки 1 практически не меняем, за исключением того, что необходимо сделать так, чтобы событие MeasureItem вызывалось для каждого пункта перерисовки списка (свойство DrawMode должно быть установлено в OwnerDrawVariable):
//Разрешаем событие DrawItem в свойстве и програмно
listBox1.DrawMode =
System.Windows.Forms.DrawMode.OwnerDrawVariable;
Тогда исходный код для обработчиков DrawItem и MeasureItem может быть следующим:
private void listBox1_DrawItem(object sender,
System.Windows.Forms.DrawItemEventArgs e)
{
//Размер шрифта
float size = 0;
//Новый шрифт для отрисовки
System.Drawing.Font font;
//Имя нового шрифта
FontFamily fontfamily = null;
//Cтираем все перерисовкой фона
e.DrawBackground();
//Создаем кисть с черным цветом
//Если пунктов более 4х - она будет кистью по умолчанию
Brush brush = Brushes.Black;
//При перерисовке пункта задаем цвет кисти
System.Drawing.Color сolor = new System.Drawing.Color();
switch (e.Index)
{
case 0:
brush = Brushes.Red;
size = 30;
сolor = System.Drawing.Color.Red;
fontfamily = FontFamily.GenericSansSerif;
break;
case 1:
brush = Brushes.Orange;
size = 25;
сolor = System.Drawing.Color.Orange;
fontfamily = FontFamily.GenericMonospace;
break;
case 2:
brush = Brushes.Purple;
size = 20;
сolor = System.Drawing.Color.Purple;
fontfamily = FontFamily.GenericSansSerif;
break;
case 3:
brush = Brushes.Blue;
size = 15;
сolor = System.Drawing.Color.Blue;
fontfamily = FontFamily.GenericSerif;
break;
}
//Рисуется эллипсы, вписанные в квадраты различными цветами
//Величина квадрата базируется на длине имени пункта
Rectangle rectangle = new Rectangle(2, e.Bounds.Top+2,
e.Bounds.Height, e.Bounds.Height-4);
e.Graphics.FillEllipse(new SolidBrush(сolor), rectangle);
// Пишем строку заданны шрифтом
font = new Font(fontfamily, size, FontStyle.Bold);
// Выводим конкретный пункт
e.Graphics.DrawString(listBox1.Items[e.Index].ToString(),
font,brush,new RectangleF(e.Bounds.X+rectangle.Width,
e.Bounds.Y, e.Bounds.Width, e.Bounds.Height));
//Если ListBox в фокусе выбирается данный пункт
e.DrawFocusRectangle();
}
//Сообщаем, что изменился размер области для пункта
private void listBox1_MeasureItem(object sender,
System.Windows.Forms.MeasureItemEventArgs e)
{
switch(e.Index)
{
case 0:
e.ItemHeight = 40;
break;
case 1:
e.ItemHeight = 35;
break;
case 2:
e.ItemHeight = 30;
break;
case 3:
e.ItemHeight = 25;
break;
}
}
Результат реализации данного решения представлен на Рис. 3.
Рис.3. Изменения шрифтов пунктов ListBox