Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа 4.doc
Скачиваний:
31
Добавлен:
15.04.2015
Размер:
215.04 Кб
Скачать

Удаление пунктов из списка

Для удаления пунктов из списка можно воспользоваться одним из следующих способов:

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