Гид по технологиям

Создание диалогового окна ввода в Windows Forms

• 6 min read • Разработка • Обновлено 18 Nov 2025
Диалог ввода в Windows Forms — пример и код
Диалог ввода в Windows Forms — пример и код

Ноутбук и растение на круглом столе, вид сверху

Диалоговые окна часто используются в настольных приложениях для запроса данных у пользователя. В Windows Forms вы можете создать такое окно программно: создать новую форму, добавить на неё элементы управления (метки, текстовые поля, кнопки “ОК” и “Отмена”) и показать форму как модальное диалоговое окно. После закрытия диалога вы можете получить введённое значение и использовать его в приложении.

Что вы получите в этой статье

  • Готовую реализацию InputBox на C# с пояснениями.
  • Инструкцию по созданию и настройке кнопки, запускающей диалог.
  • Таблицу свойств для элементов (локализованные подписи).
  • Чек-листы для разработчика, тестировщика и дизайнера.
  • Альтернативные подходы и рекомендации по локализации и безопасности.

Шаг 1. Добавление кнопки, которая откроет диалог

Добавляйте диалог только по событию: например, при клике по кнопке. Для начала сбросьте на форму кнопку из панели инструментов Visual Studio.

  1. Создайте новое приложение Windows Forms в Visual Studio.
  2. В панели Toolbox найдите элемент Button и перетащите его на форму.

Кнопка перетянута на холст WinForms

  1. В окне свойств измените значения для кнопки следующим образом:
СвойствоНовое значение
NamedialogButton
Size400, 100
TextОткрыть окно ввода

Изменённые свойства кнопки на холсте WinForms

  1. Перетащите на форму Label и разместите её справа от кнопки.

  2. В окне свойств для метки установите:

СвойствоНовое значение
NamelabelResponseInput
VisibleFalse

Добавлена метка на холст WinForms

  1. Дважды щёлкните по кнопке “Открыть окно ввода” — Visual Studio сгенерирует обработчик события клика в файле кода формы.
private void dialogButton_Click(object sender, EventArgs e)
{
    // Код, который выполнится при клике на кнопку
}

Шаг 2. Реализация функции InputBox

Реализуем функцию, которая программно создаёт новую Form, добавляет на неё Label, TextBox и две кнопки, и возвращает DialogResult. Функция получает заголовок, текст подсказки и параметр ref для возврата введённого значения.

public static DialogResult InputBox(string title, string promptText, ref string value)
{
    Form form = new Form();
    Label label = new Label();
    TextBox textBox = new TextBox();
    Button buttonOk = new Button();
    Button buttonCancel = new Button();

    // Заголовок и текст подсказки
    form.Text = title;
    label.Text = promptText;

    // Текст и результат для кнопок
    buttonOk.Text = "OK";
    buttonCancel.Text = "Отмена";
    buttonOk.DialogResult = DialogResult.OK;
    buttonCancel.DialogResult = DialogResult.Cancel;

    // Позиционирование элементов
    label.SetBounds(36, 36, 372, 13);
    textBox.SetBounds(36, 86, 700, 20);
    buttonOk.SetBounds(228, 160, 160, 60);
    buttonCancel.SetBounds(400, 160, 160, 60);

    // Свойства формы
    label.AutoSize = true;
    form.ClientSize = new Size(796, 307);
    form.FormBorderStyle = FormBorderStyle.FixedDialog;
    form.StartPosition = FormStartPosition.CenterScreen;
    form.MinimizeBox = false;
    form.MaximizeBox = false;

    // Добавление контролов и привязка кнопок по умолчанию
    form.Controls.AddRange(new Control[] { label, textBox, buttonOk, buttonCancel });
    form.AcceptButton = buttonOk;
    form.CancelButton = buttonCancel;

    // Показать диалог и вернуть результат
    DialogResult dialogResult = form.ShowDialog();
    value = textBox.Text;
    return dialogResult;
}

Замечания:

  • Параметр value передаётся по ссылке (ref) и после закрытия диалога содержит введённую строку.
  • DialogResult позволяет определить, нажал ли пользователь “ОК” или “Отмена”.

Шаг 3. Вызов InputBox из обработчика кнопки

В обработчике dialogButton_Click создайте переменную и вызовите InputBox. Если диалог вернул OK — покажите результат в метке.

private void dialogButton_Click(object sender, EventArgs e)
{
    string value = string.Empty;

    if (InputBox("Диалог", "Как вас зовут?", ref value) == DialogResult.OK)
    {
        labelResponseInput.Visible = true;
        labelResponseInput.Text = "Ваше имя: " + value;
    }
}

Запуск и проверка результата

  1. Нажмите зелёную кнопку запуска в Visual Studio.

Зелёная кнопка запуска в верхней части Visual Studio

  1. В приложении нажмите “Открыть окно ввода” — откроется сформированный вами диалог.

Диалог ввода WinForms во время выполнения

  1. Введите имя и нажмите OK — диалог закроется и метка покажет результат.

WinForms во время выполнения с результатом из диалога

  1. Откройте диалог снова и нажмите Отмена — никаких изменений не произойдёт.

Советы по расположению и размерам элементов

  • Подбирайте ширину текстового поля с запасом для ожидаемых данных; 700px в примере рассчитаны на длинные строки, но адаптируйте под локаль.
  • Для коротких вводов (имя, номер) используйте меньшую ширину и компактные кнопки.
  • Учитывайте масштабирование DPI: проверяйте интерфейс при 125% и 150% масштабировании.

Важно: фиксированные координаты просты и быстро работают для демонстрации, но для реального продукта лучше использовать TableLayoutPanel или TableLayout для адаптивного размещения.

Альтернативные подходы (когда это полезно)

  1. Использовать отдельную Form-класс (наследовать Form) с дизайнером, а не создавать элементы программно — удобнее для сложных форм.
  2. Для простых вводов можно использовать Microsoft.VisualBasic.Interaction.InputBox (требует ссылки на Microsoft.VisualBasic) — быстрый, но менее гибкий вариант и не всегда желателен в чисто C# проектах.
  3. В больших проектах применять MVVM/MVP-подход и показывать диалоги через сервис диалогов (DialogService), чтобы отделить UI от логики и упростить тестирование.

Ментальные модели и эвристики

  • Ментальная модель: диалог — это синхронный запрос данных от пользователя, который блокирует вто́ричный поток (модально). Используйте модальные диалоги для обязательных данных, немодальные — для подсказок и дополнительных панелей.
  • Эвристика: если форма содержит больше трёх полей, вероятно, стоит использовать отдельную форму с понятной вёрсткой и валидацией.

Чек-листы по ролям

Разработчик:

  • Реализовать InputBox как переиспользуемую функцию/сервис.
  • Локализовать все текстовые строки (заголовки, кнопки, подсказки).
  • Проверить обработку пустой строки и длину ввода.
  • Развернуть тестовую сборку и проверить DPI и разные темы Windows.

Тестировщик:

  • Проверить поведение при нажатии Enter и Esc.
  • Проверить на разных масштабах экрана и разрешениях.
  • Проверить ввод специальных символов и длинных строк.
  • Проверить доступность (Tab-порядок, экранные читалки).

Дизайнер/UX:

  • Убедиться, что текст подсказки ясен и краток.
  • Предложить валидацию с поясняющей ошибкой в диалоге.
  • Проверить соответствие визуального стиля приложения и диалога.

Критерии приёмки

  • Диалог открывается по клику на кнопку и центрируется на экране.
  • При нажатии OK введённое значение возвращается в вызывающий код и отображается.
  • При нажатии Отмена никаких изменений не происходит.
  • Диалог корректно работает при масштабировании DPI и не выходит за пределы экрана.
  • Все пользовательские строки локализованы.

Примеры тест-кейсов

  1. Ввод валидного имени, нажать OK — имя отобразится.
  2. Оставить поле пустым, нажать OK — приложение должно корректно отобразить пустую строку или показать сообщение (в зависимости от требований).
  3. Нажать Отмена — метка остаётся скрытой.
  4. Ввести очень длинную строку — проверить, что она правильно сохраняется и не ломает интерфейс.
  5. Нажать Enter — диалог должен принять значение (если кнопка OK назначена как AcceptButton).

Тонкие места и распространённые проблемы (и их решения)

  • Проблема: текст обрезается или элементы выходят за границы при высоком DPI. Решение: используйте TableLayoutPanel, Anchor/Dock и тестируйте при разных масштабах.
  • Проблема: диалог не возвращает введённое значение. Решение: убедитесь, что вы записываете value = textBox.Text ДО возврата DialogResult.
  • Проблема: некорректная локализация кнопок и подсказок. Решение: вынесите строки в ресурсные файлы (.resx) и загружайте по культуре.

Локализация и доступность

  • Переводите все тексты в .resx — это упростит поддержку нескольких языков.
  • Для русской локали краткость подсказок часто важнее, чем буквальная калька с английского.
  • Проверяйте порядок табуляции и подписи для экранных читалок (AccessibleName, AccessibleDescription).

Безопасность и приватность

  • Не храните чувствительные данные в открытом виде в простых текстовых полях. Для паролей используйте TextBox с PasswordChar.
  • Если диалог собирает персональные данные, убедитесь, что приложение соответствует внутренним требованиям конфиденциальности и регуляциям.

Когда этот подход не подходит

  • Если вам нужен асинхронный UX (неблокирующий ввод) — используйте немодальные окна или панель внутри основного окна.
  • Для сложных форм с несколькими шагами лучше использовать отдельную форму с навигацией (wizard) или модульную страницу.

Мини-методология внедрения

  1. Написать и протестировать простую функцию InputBox.
  2. Вынести тексты в ресурсы и локализовать.
  3. Заменить программную расстановку контролов на TableLayoutPanel при необходимости адаптивности.
  4. Добавить юнит/интеграционные тесты для сервисов, которые запускают диалоги (через интерфейс-обёртку).

Краткая сводка

  • Создание диалога ввода в WinForms состоит из: создания Form, добавления Label/TextBox/кнопок и показа формы методом ShowDialog().
  • Для продакшн-кода рекомендуются: локализация, адаптивная вёрстка, обработка ошибок и доступность.

Ключевые моменты:

  • Используйте модальность для обязательных данных.
  • Для сложной логики выносите диалог в отдельный класс/файл с дизайнером.
  • Тестируйте интерфейс при разных масштабах и локалях.

Спасибо за внимание — теперь у вас есть рабочая InputBox-функция и набор практических рекомендаций для интеграции в проект.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро