Жанр: Учеба
Си шарп: создание приложений для windows
...е company.
Это Double и Foo. Но программа вывела на экран для группы company
только одно слово Foo. На самом деле программа добавила в группу
company два элемента. Но слово Foo было добавлено в вершину коллекции,
поэтому именно оно и вывелось на экран. Если мы хотим увидеть
все содержимое группы company, то нам придется переписать код так,
чтобы обрабатывались все элементы коллекции.
using System;
using Sys~em.Text.RegularExpressions;
namespace Programming_CSharp
{
class Test
{
public static void Main( )
{
string stringl =
"04:03:27 Double 127.0.0.0 Foo ";
Regex theReg = new Regex(
@" (?"время"(\dl\:)+} \s" +
@" (?"company"\S + ) \s" (•
@" (?"ip"(\dl\.)+)\sn т
@"(?"company"\S+)\s");
/7 получаем коллекцию поиска
MatchCollection theMatches =
theReg.Matches(stringl);
// перебор всей коллекции
foreach (Match theMatch in theMatches)
{
if (theMatch.Length != 0)
// выводим найденную подстроку
Console.WriteLine("\ntheMatch: {0)",
theMatch.ToString ( ));
// выводим группу "time"
242 Раздел I I . Фундаментальные понятия
Console.WriteLine("время: {0}",
theMarch.Groups["время"]);
// выводим группу "ip"
Console.WriteLine ("ip: {0}",
theMatch.Groups["ip"]);
// выводим группу "company"
Console.WriteLine("company: {0)",
theMatch.Groups["company"]);
int idx^O;
foreach (Capture company in
theMatch.Groups["company"].Captures)
Console.WriteLine("company {0}: {1}
idx, company,ToString( ));
Теперь программа выдаст ожидаемый результат:
theMatch: 04:03:27 Double 127.0.0.0 Foo
время: 04:03:27
ip: 127.0.0.0
company: Foo
company 1: Double
company 2: Foo
ш Кнопки и блок группировки
" поля ввода и списки
н Метки, индикаторы прогресса и бегунки
"* ListView и TreeView
"• Спиок изображений ImageList
i i Полосы прокрутки
т * Меню
о ш Панель инструментов - ToolBar
ш ш Создание MDI приложении
&(r) Обработка сообщений мыши
i i Работа с графикой
ш ш Работа с клавиатурой
• ш Таймер и время
т т ФаЙЛЫ
ш ш Работа с базами данных
"• Отладка программ
ш т Так что же лучше, С# или Java?
еш Приложение
19. КНОПКИ И БЛОК ГРУППИРОВКИ
В этом разделе я постарался рассмотреть наиболее часто используемые
компоненты при создании Windows Forms приложений. К основным компонентам
относятся самые популярные элементы управления Windows,
меню, панель управления, с которыми вы постоянно сталкиваетесь при
работе в Windows. Примеры программ с использованием описываемых
компонентов, приведенные в этой глаЕе, помогут вам быстрее усвоить рассматриваемый
материал.
КНОПКИ -Button
Кнопкой называется элемент управления, все взаимодействие
пользователя с которым ограничивается одним действием - нажатием.
Все, что вам необходимо сделать при работе с кнопкой,- это поместить
ее в нужном месте формы и назначить ей соответствующий обработчик.
Обработчик назначается для события Click.
ЧЕКБОКСЫ - CheckBox
Р,?***" Первое, что необходимо сказать о чекбоксах, это то, что они
являются кнопками отложенного действия, т. е. их нажатие не должно
запускать какое-либо немедленное действие. С их помощью пользователи
вводят параметры, которые скажутся после, когда действие будет
запущено иными элементами управления. Элемент CheckBox может иметь
3 состояния - помеченное, непомеченное и смешанное. Чаще всего этот
элемент применяется для определения значений, которые могут иметь
только два состояния.
РАДИОКНОПКИ - RadioButton
^ Радиокнопки по своим свойствам немного похожи на чекбоксы.
Их главное различие заключается в том, что группа чекбоксов позволяет
выбрать любую комбинацию параметров, радиокнопки же дают
возможность выбрать только один параметр. Из этого различия проистекают
и все остальные. Например, в группе не может быть меньше двух
радиокнопок. Кроме того, у радиокнопок не может быть смешанного состояния
(нельзя совместить взаимоисключающие параметры).
Кнопки и блок группировки 245
БЛОК ГРУППИРОВКИ -GroupBox
""Скч*л Блок группировки помогает ви- а****,**
зуально объединить несколько элементов
управления в одну группу. Это бывает осо- ,• 3bK^itt ;
бенно полезно, когда надо придать вашему .- С1ЧЬЙ
приложению более понятный пользовательский
интерфейс. Например, объединить групTTV
пяттпкипттпк Ггм пиг i q n Рис. 19.1. Пример использования
пу раДИОКНОПОК (.СМ. РИС. 19. U блока группировки для объединеДаваите
напишем программу, использую- Ния радиокнопок
щую все вышеописанные компоненты. Программа
будет выполнять следующие функции:
радиокнопки задают текст сообщения, которое будет выводиться по
нажатию на обычную кнопку. Чекбокс должен определять - выводить сообщение
или нет.
Создайте новый Windows Forms проект удаииви!
под названием TestButtons. Сохраните его в ^v .
созданную для наших проектов папку. Изме- (_ -лЬЛ{, .
ните некоторые свойства созданной формы:
Name ~ "TestButtonsForm"
Text - иТест для кнопок". 4
Теперь добавьте на вашу форму один t-i-***"•.
элемент управления GroupBox, три элемента
RadioButton, один элемент CheckBox и один
элемент Button. Я разместил их таким обра- ". [
зом, как показано на рис. 19.2. Вы можете ^ \ujzlj i
последовать моему примеру, или разместить -г • -гг- — -'
элементы произвольным образом. Однако Рис_ 1 9 2 " Проектированиеформы
Заметьте, ЧТО ВСе три раДИОКНОПКИ ДОЛЖНЫ для приложения TestButtons
быть помещены в один GroupBox. Иначе они
не будут связаны между собой.
Теперь измените некоторые свойства добавленных элементов:
buttonl:
Text - показать сообщение
groupBoxl:
Text - выберите текст сообщения
radioButtonl:
Text - первое сообщение
radioButton2:
Text-второе сообщение
radioButton3:
Text -третье сообщение
checkBoxl:
Text - показывать сообщение
Checked - True
246 Раздел I I I . Программирование для Windows
Возможно, для того чтобы придать вашей форме более достойный вид,
вам придется изменить размеры некоторых элементов управления.
Теперь давайте обратимся к коду нашей программы, который создала
среда Visual Studio .NET:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace TestButtons
{
/// "summary"
/// Summary description for Forml.
/// "/summary"
public class TestButtonsForm: System.Windows.Forms.Form
{
private System.Windows.Forms.Button buttonl;
private System.Windows.Forms.GroupBox groupBoxl;
private System.Windows.Forms.RadioButton radioButtonl;
private System.Windows.Forms.RadioButton radioButton2;
private System.Windows.Forms.RadioButton radioButton3;
private System.Windows.Forms.CheckBox checkBoxl;
/// "summary"
/// Required designer variable.
/// "/summary"
private System.ComponentModel.Container components - null;
public TestButtonsFormO
// Required for Windows Form Designer support
//
InitializeComponent 0 ;
//
// TODO: Add any constructor code after InitializeComponent call
/// "summary"
/// Clean up any resources being used.
/// "/summary"
protected override void Dispose( bool disposing )
{
if ( disposing )
Кнопки и блок группировки 247
if (components !=• null)
components.Dispose ();
1
f
base.Dispose( disposing );
#region Windows Form Designer generated code
/// "summary"
/// Required method for Designer support-do not modify
/// the contents of this method with the code editor.
/// "/summary"
private void InitializeComponent()
(
this.buttonl = new System.Windows.Forms.Button();
this.groupBoxl = new System.Windows.Forms.GroupBox();
this.radioButton3 = new System.Windows.Forms.RadioButton();
this.radioButton2 - new System.Windows.Forms.RadioButton();
this.radioButtonl = new System.Windows.Forms.RadioButton f);
this.checkBoxl = new System.Windows.Forms.Checkbox();
this.groupBoxl.SuspendLayout();
this.SuspendLayout();
//
// buttonl
//
this.buttonl.Location = new System.Drawing.Point(80, 240);
this.buttonl.Name = "buttonl";
this.buttonl.Size = new System.Drawing.Size(128, 23);
this.buttonl.Tablndex = 0;
this.buttonl.Text - "Показать сообщение";
//
// groupBoxl
//
this.groupBoxl.Controls.AddRange{new System.Windows.Forms-Control[] {
this.radioButton3,
this.radioButton2,
this.radioButtonl});
this.groupBoxl.Location = new System.Drawing.Point(8, 16);
this.groupBoxl.Name = "groupBoxl";
this.groupBoxl.Size = new System.Drawing.Size(280, 112);
this.groupBoxl.Tablndex = 1;
this.groupBoxl.TabStop = false;
this.groupBoxl.Text = "Выберите текст сообщения";
248 Раздел I I I . Программирование для Windows
// radioButton3
//
this.radioButton3.Location = new System.Drawing.Point (16, 80);
this.radioButton3.Name = "radioButtonl";
this.radioButton3.Size = new System.Drawing.Size(240, 24);
this.radioButton3.TabIndex = 2;
this.radioButton3.Text = "третье сообщение";
//
// radioButton2
//
this.radioButton2.Location = new System.Drawing.Point(16, 52);
this.radioButton2.Name = "radioButton2";
this.radioButton2.Size -= new System. Drawing. Size (240, 24);
this.radioButton2.Tablndex = 1;
this.radioButton2.Text = "второе сообщение";
//
// radioButtonl
//
this.radioButtonl.Location = new System.Drawing.Point(16, 24);
this.radioButtonl.Name - "radioButtonl";
this.radioButtonl.Size ~ new System.Drawing.Size(240, 24);
this.radioButtonl.Tablndex - 0;
this.radioButtonl.Text - "первое сообщение";
//
// checkBoxl
//
this.checkBoxl.Checked = true;
this.checkBoxl.Checkstate = System.Windows.Forms.CheckState.Checked;
this.checkBoxl.Location = new System.Drawing.Point(24, 136);
this.checkBoxl.Name = "checkBoxl";
this.checkBoxl.Size = new System.Drawing.Size(256, 24);
this.checkBoxl.Tablndex = 2;
this.checkBoxl.Text = "Показывать сообщение";
//
// TestButtonsForm
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 131;
this.ClientSize = new System.Drawing.Size(292, 273);
this.Controls.AddRange(new System.Windows.Forms.Control[] f
this.checkBoxl,
this.groupBoxl,
this.buttonl});
this.Name = "TestButtonsForm";
this.Text = "Тест для кнопок";
Кнопки и блок группировки 249
this.groupBoxl.ResumeLayout(false);
this.ResumeLayout(false) ;
ttendregion
/// "summary"
/// The main entry point for the application.
/// "/summary"
[STAThreadl
static void Main!)
{
Application. Run (new Forml ());
Ваш код может отличаться от моего координатами расположения элементов
управления и их размером. То есть свойствам Location и Size объектов
в функции InitializeComponent могут присваиваться другие значения.
Это никак не влияет на работоспособность программы.
Для начала необходимо изменить имя формы, с которой будет запускаться
приложение. Как вы помните, мы переименовали Forml в TestButtonsForm.
Найдите в коде строку
Application.Run(new Forml());
и замените ее на:
Application.Run(new TestButtonsForm О ) ;
Теперь программа работоспособна. Если вы строго следовали всем
инструкциям, то программа должна построиться без ошибок. Откомпилируйте
ее и запустите. Пока наша программа не способна выполнять какие-либо
действия. Давайте наделим ее функциональностью.
Добавьте функцию-обработчик для кнопки buttonl. Используйте имя
по умолчанию для этой функции - button l_Click, создаваемое средой Visual
Studio .NET. При этом в функцию InitializeComponent добавится строка:
this.buttonl.Click += new System.EventHandler(this,buttonl_Click);
и появится тело самой функции:
private void buttonl_Click(object sender, System.EventArgs e)
}
Добавьте в тело функции button l_Click следующий код:
//объявляем строковую переменную
/'/для хранения выбранного сообщения
string strMessage-"";
//определяем какая именно радиокнопка отмечена
//и выбираем в соответствии с этим
•'/текст выводимого сообщения
250 Раздел I I I . Программирование для Windows
//проверяем первую радиокнопку
if(radioButtonl.Checked == true)
(
//если отмечена именно эта кнопка
//то копируем текст кнопки в переменную
strMessage = radioButtonl.Text;
i
//проверяем вторую радиокнопку
else if (radioButton2.Checked =- true)
{
//если отмечена именно эта кнопка
//то копируем текст кнопки в переменную
strMessage -= radioButton2 .Text;
}
//проверяем третью радиокнопку
else if(radioButton3.Checked =- true)
{
//если отмечена именно эта кнопка
//то копируем текст кнопки в переменную
strMessage - radioButton2.Text;
//проверяем, установлен ли чекбокс
//разрешающий вывод сообщения
//если да, то выводим выбранное сообщение на экран
if (checkBoxl.Checked =и true)
{
MessageBox.Show("Вы выбрали " f strKessage);
Подробное описание работы функции приведено в комментариях, поэтому
я не буду повторяться. Откомпилируйте и запустите программу.
Выберите первую радиокнопку "первое сообщение". Нажмите кнопку Показать
сообщение. На экране появится надпись: Вы выбрали первое сообщение.
Выбрав иную радиокнопку, вы получите другой текст сообщения.
Теперь уберите флажок Показывать сообщение. Нажмите кнопку Показать
сообщение. На экране ничего не должно появиться. Если программа
работает в строгом соответствии с данным описанием, значит, вы все
сделали верно.
20. ПОЛЯ ВВОДА И СПИСКИ
ПОЛЕ ВВОДА-TextBox
Этот элемент управления является основным, предназначенным
для ввода пользователем текстовых данных. Использовать TextBox можно в
однострочном или многострочном режиме. Однако данный элемент управления
имеет ограничение - до 64 кВт текста. Если вам необходимо обрабатывать
большие объемы информации, лучше использовать элемент RichTextBox.
РАСШИРЕННОЕ ПОЛЕ ВВОДА - RichTextBox
Данный элемент управления дает возможность пользователю
вводить и обрабатывать большие объемы информации (более 64 кБт).
Кроме того, RichTextBox позволяет редактировать цвет текста, шрифт,
добавлять изображения. RichTextBox включает все возможности текстового
редактора Microsoft Word.
СПИСОК -ListBox
ListBox - простейший вариант пролистываемого списка. Он
позволяет выбирать один или несколько хранящихся в списке элементов.
Кроме того, ListBox имеет возможность отображать данные в нескольких
колонках. Это позволяет представлять данные в большем объеме и не
утомлять пользователя скролированием.
ПОМЕЧАЕМЫЙ СПИСОК - Checked ListBox
j j "tectodtrtft". Помечаемый список является разновидностью простого списка.
Его дополнительное достоинство - в наличии чекбоксов рядом с каждым
элементом списка. Пользователь имеет возможность отметить один
или несколько элементов списка, выставив напротив его флажок.
ВЫПАДАЮЩИЙ СПИСОК - ComboBox
Я """*"?* Этот вариант списка удобен тем, что не занимает много пространства
на форме. Постоянно на форме представлено только одно зна252
Раздел I I I . Программирование для Windows
чение этого списка. При необходимости пользователь может раскрыть
список и выбрать другое интересующее его значение. Кроме того, режим
DropDown дает пользователю возможность вводить собственное значение
при отсутствии необходимого значения в списке.
Давайте рассмотрим пример использования списков. Напишем программу,
предназначенную для учета данных об участниках соревнований.
Программа будет содержать два списка - ComboBox, для ввода информации
об участниках, и Checked Li stBox, для хранения и обработки данных. С
помощью списка ComboBox пользователь будет выбирать фамилии лиц,
которых необходимо добавить в список участников. Две кнопки на форме
будут добавлять или удалять участников из списка.
Создайте новый Windows Forms проект под названием TestLists. Сохраните
его в созданную для наших проектов папку. Переименуйте файл
Forml.cs в TestListsForm.cs. Теперь добавьте на вашу форму следующие
элементы управления:
м GroupBox, и поместите в него CheckedListBox
• ComboBox
• два элемента Button.
Я разместил их таким образом, как представлено на рис. 20.1. Вы можете
последовать моему примеру, или разместить элементы произвольно.
В данном примере можно было обойтись и без элемента GroupBox,
так как он предназначен только для оформления интерфейса программы.
Однако возьмите себе за хорошую привычку всегда помещать списки
внутрь GroupBox элементов. Это сделает ваши программы более привлекательными.
Измените некоторые свойства созданной формы:
Text -"работа со списками"
Теперь изменим свойства элементов управления:
groupBoxl:
Text - "список участников"
CheckedListBox:
Name - memberList
h R 1 • П * ттгтштшш^л (
Name - peopleList №u""". !
Text -"" 7 .\~-"~-'- "" ь^едг | i
buttonl: . |
Name - buttonAdd I
Text - "Добавить" -, ' J.
button2: i ;
Name -buttonDelete , I
Text - "Удалить" ' !
Элементы управления ComboBox и Check- , i
edListBox могут быть проинициализирова- "fu ^ ^ ^ *?"•*"! J !
ны с помощью дизайнера среды Visual ~" n -I
Studio.Net. Для хранения элементов спис- " " "", "" .
^ ^ Рис. 20.1. Проектирование формы
КОВ Данные КОМПОНенТЫ Имеют СВОЙСТВО приложения TestLists
Поля ввода и списки 253
Items. Свойство Items само по себе является
массивом строк. Давайте проинициализируем
элемент управления ComboBox, который
имеет имя peopleList, списком фамилий предполагаемых
участников соревнований. Для
этого в окне свойств peopleList выберите свойство
Items. Откройте окно String Collection
Editor, нажав на кнопку с тремя точками в
поле Items. Добавьте в предложенный список
три фамилии: Иванов, Петров, Сидоров
(рис. 20.2).
И напоследок, добавьте обработчики для
кнопок Добавить и Удалить, два раза щелкнув Рис' 20"2" Р е д а к т о р с п и с к а с т р о к
левой кнопкой мыши по каждой из кнопок.
Подготовительный этап к написанию программы завершен. Сохраните
сделанные вами изменения. Теперь давайте обратимся к коду программы.
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace TestLists
/// "summary"
/// Summary description for FormI.
/// "/summary"
public class FormI: System.Windows.Forma.Form
private System.Windows,Forms.GroupBox groupBoxl;
private System.Windows.Forms.CheckedListBox memberList;
private System.Windows.Forms.ComboBox peopleList;
private System.Windows.Forms.Button buttonAdd;
private System.Windows.Forms.Button buttonDelete;
/// "summary"
/// Required designer variable.
/// "/summary"
private System.ComponentModel.Container components = null;
public TestListsForm()
// Required for Windows Form Designer support
254 Раздел I I I . Программирование для Windows
InitializeComponent();
// TODO: Add any constructor code after InitializeComponent call
/// "summary"
/// Clean up any resources being used.
/// "/summary"
protected override void Dispose! bool disposing )
if( disposing )
if (components != null)
components.Dispose();
base.Dispose ( disposing );
#region Windows Form Designer generated code
/// "summary"
/// Required method for Designer support-do not modify
/// the contents of this method with the code editor.
/// "/summary"
private void InitializeComponent()
this.groupBoxl = new System.Windows.Forms.GroupBox();
this.memberList = new System.Windows.Forms.CheckedListBox ();
this.peopleList = new System.Windows.Forms-ComboBox();
this.buttonAdd = new System.Windows.Forms.Button();
this.buttonDelete = new System.Windows.Forms.Button();
this.groupBoxl.SuspendLayout() ;
this.SuspendLayout();
// groupBoxl
this.groupBoxl.Controls.AddRange(new System.Windows.Forms.Control[] {
this.memberList});
this.groupBoxl.Location = new System.Drawing.Point (8, 8);
this.groupBoxl.Name -= "groupBoxl";
Поля ввода и списки 255
this.groupBoxl.Size = new System.Drawing.Size(184, 216);
this.groupBoxl.Tablndex = 0;
this.groupBoxl.TabStop = false;
this.groupBoxl.Text = "Список участников";
//
// memberList
//
this.memberList.Location = new System.Drawing.Point(8, 24);
this.memberList.Name = "memberList";
this.memberList.Size = new System.Drawing.Size(168, 184);
this.memberList.Tablndex = 0;
//
// peopleList
//
this.peopleList.Items.AddRange(new object[] {
"Иванов",
"Петров",
"Сидоров"}) ;
this.peopleList.Location = new System.Drawing.Point(8, 232);
this.peopleList.Name = "peopleList";
this.peopleList.Size = new System.Drawing.Size (184, 21);
this.peopleList.Tablndex = 1;
//
// butconAdd
//
this.buttonAdd.Location = new System.Drawing.Point (200, 232);
this.buttonAdd.Name = "buttonAdd";
this.buttonAdd.Size = new System.Drawing.Size(80, 23);
this.buttonAdd.Tablndex = 2;
this.buttonAdd.Text = "Добавить";
this.buttonAdd.Click += new System.EventHandler(this-buttonAdd_Click)
//
// buttonDelete
//
this.buttonDelete.Location - new System.Drawing.Point(200, 32);
this.buttonDelete.Name = "buttonDelete";
this.buttonDelete.Size = new System.Drawing.Size(80, 23);
this.buttonDelete.Tablndex = 3;
this.buttonDelete.Text = "Удалить";
this.buttonDelete.Click += new
System.EventHandler (this .buttonDelete Click) ,-
//
// TestListsForm
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size (292, 273);
256 Раздел I I I . Программирование для Windows
this.Controls.AddRange(new System.Windows.Forms.Control[] (
this.buttonDelete,
this.buttonAdd,
this.peopleList,
chis.groupBoxlJ) ;
this.Name - "TestListsForm";
this.Text = "Работа со списками";
this.groupBoxl.ResumeLayout(false) ;
this.ResumeLayout(false) ;
#endregion
/// "summary"
/// The main entry point for the application.
/// "/summary"
[STAThread]
static void Main()
{
Application .Run (new Forml(l);
i
private void buttonDelete_Click(object sender, System.EventArgs e)
}
private void buttonAdd_Click(object sender, System.EventArgs e)
i
Если вы строго следовали моим инструкциям, то программа должна
откомпилироваться и запуститься. Проверьте это.
Сейчас необходимо добавить обработчики для кнопки "Добавить" и
"Удалить". Как известно из исходных данных, кнопка "Добавить" должна
заносить строку, выбранную в комбобоксе, в список участников. Для
этого измените функцию buttonAdd_Click так, как показано ниже:
private void buttonAdd_Click(object sender, System.EventArgs e)
{
//работаем со списком для ввода фамилий
//проверяем выбран ли элемент в списке
if(peopleList.Text.Length != 0)
{
//если элемент выбран, то переносим его в список участников
Поля ввода и списки 257
memberList.Items.Add(peopleList.Text);
}
else
i
//если элемент не выбран
//то выдаем информационное сообщение
MessageBox.Show(
"Выберите элемент Б списке для ввода или введите новый.")
Описание работы функции приведено вместе с ее кодом. Функция
memberList.Items.Add добавляет новый элемент в список memberList. При
этом параметром функции является значение свойства peopleList.Text, которое
выбирает пользователь. Теперь осталось реализовать удаление
элементов из списка. Для этого введите код для функции buttonDelete_Click.
private void buttonDelete_Click(object sender. System.EventArgs e)
{
//пока список помеченных элементов не пуст
while(memberList.Checkedlndices.Count " 0)
г
//удаляем из общего списка участников по одному элементу
//при этом список помеченных элементов автоматически обновляется
//таким образом, каждый раз нулевой элемент из Checkedlndices
//будет содержать индекс первого помеченного в списке объекта
IT ember List. Items .RemoveAt (memberList .Checkedlndices [0 ] ) ;
//при удалении из списка последнего помеченного элемента
//Checkedlndices.Count станет равным нулю
//и цикл автоматически завершится
Функция CheckedListBox.Items.RemoveAt удаляет из списка элемент по
его индексу. При этом элементы списка, идущие за удаленным, уменьшают
свой индекс на единицу. Это обязательно нужно учитывать при
дальнейшем обходе списка.
Класс CheckedListBox содержит свойство Checkedlndices, которое представляет
собой массив индексов всех помеченных элементов списка. Этот
массив тоже изменяется, если из списка был удален помеченный элемент.
А поскольку мы удаляем из списка только помеченные элементы,
то Checkedlndices будет изменяться всегда: место удаленного элемента
займет следующий за ним. Цикл продолжит работать до тех пор, пока в
списке Checkedlndices будет оставаться хоть один элемент.
Давайте рассмотрим работу нашей программы на примере. Откомпилируйте
и запустите приложение. Заполните список участников так,
как показано на рис. 20.3. Для того чтобы добавить элемент в список,
выберите его в комбобоксе и нажмите кнопку Add.
258 Раздел I I I . Программирование для Windows
Ив
Ива
! Пет
\Ст
1 Паз
анов
Петров
Ги ПГ1ОР
ОВ
ое
ров
рки
Рис. 20.3. ОКНО приложения
TestLists
НШОШК11 '• --(tm) ' По умолчанию, элемент управления Comг
а""!("я1ич ЬоВох имеет стиль DropDown (свойство СотboBox.DropDownStyle.DropDown).
ЭТОТ СТИЛЬ дает
возможность пользователю не только выбирать
элементы из списка, но и вводить данные
с клавиатуры. Поэтому для добавления
в список фамилии "Лазерко", наберите ее на
клавиатуре и нажмите кнопку Add.
Теперь давайте разберемся с логикой работы
программы при удалении элементов из
списка. Для этого выделите в списке фамилии
"Петров" и "Сидоров", которые в нашем списке
имеют индексы 1 и 2 соответственно (начиная
с нулевого). Поэтому массив Checkedlndices
будет содержать два элемента - 1 и 2. При
нажатии кнопки Delete программа по циклу начинает удалять элементы из
списка. Нулевым элементом в массиве Checkedlndices стоит число 1 (индекс
фамилии "Петров"), поэтому фамилия "Петров" первой удаляется из списка.
При этом фамилии "Сидоров" и "Лазерко" изменяют свои индексы с 2 и 3
на 1 и 2 соответственно. Массив Checkedlndices тоже модифицируется. Вопервых,
из него удалится нулевой элемент, индекс фамилии "Петров". Вовторых,
место нулевого элемента в массиве Checkedlndices теперь займет
индекс фамилии "Сидоров". А поскольку "Сидоров" теперь имеет индекс 1
в общем списке, то CheckedIndices[O] будет содержать число 1. На второй
итерации цикла удаления из списка исчезнет фамилия "Сидоров", а "Лазерко"
переместится на позицию 1. В итоге, коллекция Checkedlndices окажется
пустой, и цикл завершится.
21-МЕТКИ, ИНДИКАТОРЫ ПРОГРЕССА
И БЕГУНКИ
МЕТКА -Label
Al**.... Элемент управления Label предназначен
для создания подписей к другим элементам
управления или для вывода информационных
сообщений прямо на поверхности
формы. Например, вы можете сочетать метки
с полями ввода (см. рис. 21.1).
Здесь я расширил нашу форму TestListsForm
за счет добавления элемента управления Label
с надписью "Выберите фамилию участника или
введите новую". Согласи
...Закладка в соц.сетях