Классическая задача — получение ввода от пользователя — чаще всего решается через диалоговые окна. Например, у вас есть форма для отображения списка людей, и вы хотите иметь возможность добавления людей в список и редактирования их. Где расположить поля ввода для параметров добавляемого или редактируемого объекта? Можно в том же окне, где находится список, но лучше это делать в отдельном окне редактирования. Давайте рассмотрим это на примере.
Для примера нам понадобится новое WinForms-приложение, на главной форме которого мы поместим компонент ListView для хранения списка и две кнопки для добавления новой записи и редактирования выделенной. В списке ListView нужно:
Такую главную форму можно увидеть на рис. 11.2.
Теперь нам понадобится дочерняя форма или диалоговое окно для редактирования элементов. Щелкните правой кнопкой мыши по имени проекта в панели Solution Explorer и в контекстном меню выберите Add | New Item. В открывшемся окне найдите и выделите Windows Form и в поле Name введите имя для диалогового окна — например, EditPersonForm.

Рис. 11.2. Форма будущей программы
Сразу же поместите на форму две кнопки для сохранения и отмены изменений, а также три поля ввода: для изменения имени, фамилии и возраста. Для изменения возраста можно использовать компонент NumericUpDown, который хорошо подходит для редактирования чисел. Мой вариант формы можно увидеть на рис. 11.3, но ваш может и отличаться.

Рис. 11.3. Форма диалогового окна
Теперь несколько рекомендаций по оформлению диалоговых окон, которым не обязательно следовать, но которые чаще всего положительно сказываются на удобстве использования программ:
Еще пару манипуляций нужно сделать над кнопками. Для кнопки Сохранить установите свойство DialogResult в OK, а для кнопки Отмена установите это же свойство в Cancel. Теперь, если окно отображается в модальном режиме, то по нажатию любой из этих кнопок окно будет закрыто, а форма вернет в качестве результата то, что мы указали для кнопок в свойстве DialogResult.
Теперь посмотрим, как может использоваться эта форма. Для начала в коде формы добавим три свойства, через которые будет происходить обращение к полям ввода:
public string FirstName
{
get { return firstNameTextBox.Text; }
set { firstNameTextBox.Text = value; }
}
public string LastName
{
get { return lastNameTextBox.Text; }
set { lastNameTextBox.Text = value; }
}
public int Age
{
get { return (int)ageNumericUpDown.Value; }
set { ageNumericUpDown.Value = value; }
}
Добавленные здесь свойства являются посредниками между диалоговым окном редактирования и главным окном, из которого будет вызываться это диалоговое окно.
Теперь все готово, чтобы написать код, который будет создавать новые элементы в списке и редактировать их. Для начала создайте обработчик события Click для кнопки Добавить главной формы и напишите в нем содержимое листинга 11.1.
Листинг 11.1. Код добавления нового элемента в список
private void addPersonButton_Click(object sender, EventArgs e)
{
// создаем форму
EditPersonForm editForm = new EditPersonForm();
// отображаем форму
if (editForm.ShowDialog() != DialogResult.OK)
return;
ListViewItem newItem =
personsListView.Items.Add(editForm.FirstName);
newItem.SubItems.Add(editForm.LastName);
newItem.SubItems.Add(editForm.Age.ToString());
}
В самом начале создается экземпляр класса EditPersonForm, а этим классом является форма. Следующим этапом идет отображение формы editForm.ShowDialog(), и тут же проверяется результат, который возвращает метод ShowDialog(). Если результат не равен DialogResult.OK (а этот результат возвращает кнопка Сохранить в диалоговом окне), то выполнение метода прерывается.
После этого создается новый элемент для списка ListView и заполняются два подэлемента, которые будут отображаться в колонках. Для чтения данных из объекта диалогового окна editForm используются свойства, которые мы написали.
Теперь посмотрим на метод, который выполняет редактирование выделенного в списке элемента. Этот код вы можете увидеть в листинге 11.2.
Листинг 11.2. Редактирование с помощью диалогового окна
private void editPersonButton_Click(object sender, EventArgs e)
{
if (personsListView.SelectedItems.Count == 0)
return;
// для удобства сохраняем выделенный элемент в локальной переменной
ListViewItem item = personsListView.SelectedItems[0];
// создаем форму
EditPersonForm editForm = new EditPersonForm();
// заполняем поля формы значениями
editForm.FirstName = item.Text;
editForm.LastName = item.SubItems[1].Text;
editForm.Age = Convert.ToInt32(item.SubItems[2].Text);
if (editForm.ShowDialog() != DialogResult.OK)
return;
item.Text = editForm.FirstName;
item.SubItems[1].Text = editForm.LastName;
item.SubItems[2].Text = editForm.Age.ToString();
}