Строка MessageBox.Show("Текст", "Заголовок", MessageBoxButtons.YesNo) — это минимальный рабочий способ вывести диалоговое окно с кнопками «Да» и «Нет» в приложении Windows Forms на C#. Однако просто показать окно недостаточно: без проверки возвращаемого значения DialogResult программа не узнает, что именно нажал пользователь, и логика подтверждения действия работать не будет.
В этой статье разберём синтаксис метода MessageBox.Show, обработку результата, варианты оформления диалога и типичные ошибки, с которыми сталкиваются начинающие разработчики. Примеры приведены для классического WinForms, но принципы применимы и в других UI-фреймворках .NET.
Синтаксис MessageBox.Show с кнопками Yes и No
Метод MessageBox.Show имеет множество перегрузок. Для диалога с кнопками «Да» и «Нет» чаще всего используется вариант с четырьмя параметрами: текст сообщения, заголовок окна, набор кнопок и иконка.
DialogResult result = MessageBox.Show(
"Вы действительно хотите удалить файл?",
"Подтверждение удаления",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
Параметр MessageBoxButtons.YesNo определяет, что в окне будут отображены именно кнопки «Да» и «Нет». Обратите внимание: их подписи зависят от языка операционной системы пользователя — на русской Windows это будут «Да» и «Нет», на английской — «Yes» и «No». Переопределить текст кнопок стандартными средствами MessageBox нельзя.
Обработка результата: DialogResult.Yes и DialogResult.No
Метод MessageBox.Show возвращает значение перечисления DialogResult. Для кнопок Yes и No это соответственно DialogResult.Yes и DialogResult.No. Результат сравнивают через обычное условие if.
if (MessageBox.Show("Сохранить изменения?", "Выход",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
SaveChanges();
}
else
{
// Пользователь отказался — действие не выполняем
}
Важный нюанс: нажатие крестика в заголовке окна или клавиши Esc для диалога Yes/No обычно трактуется как отказ, то есть эквивалентно DialogResult.No. Поэтому ветка else должна быть безопасной — в ней не должно выполняться деструктивных действий.
⚠️ Внимание: никогда не выполняйте необратимые операции (удаление файлов, очистку базы данных) без проверки результата. Код вида MessageBox.Show(...); DeleteFile(); удалит файл независимо от ответа пользователя.
☑️ Правильный диалог подтверждения
Доступные наборы кнопок и иконки
Перечисление MessageBoxButtons предлагает несколько готовых комбинаций кнопок, а MessageBoxIcon — стандартные системные иконки. Их сочетание помогает пользователю быстрее понять смысл диалога.
| Набор кнопок | Когда применять | Возможный DialogResult |
|---|---|---|
| YesNo | Простое подтверждение действия | Yes, No |
| YesNoCancel | Действие с возможностью отмены (например, при закрытии документа) | Yes, No, Cancel |
| OK | Информационное сообщение без выбора | OK |
| OKCancel | Подтверждение или отмена операции | OK, Cancel |
| RetryCancel | Повтор неудавшейся операции | Retry, Cancel |
Для иконок логика такая: MessageBoxIcon.Question — для вопросов, MessageBoxIcon.Warning — для предупреждений о последствиях, MessageBoxIcon.Error — для сообщений о сбоях. Для подтверждения удаления уместны Question или Warning.
- 🔹 Question — нейтральный вопрос пользователю
- 🔸 Warning — действие имеет последствия, стоит подумать
- 🔴 Error — операция завершилась неудачей
- ℹ️ Information — просто уведомление
Кнопка по умолчанию и дополнительные параметры
Пятым параметром можно передать MessageBoxDefaultButton, чтобы задать кнопку, активную по умолчанию (срабатывает по Enter). Для потенциально опасных операций правильным тоном считается делать кнопкой по умолчанию Button2, то есть «Нет»:
MessageBox.Show("Удалить все записи?", "Внимание",
MessageBoxButtons.YesNo,
MessageBoxIcon.Warning,
MessageBoxDefaultButton.Button2);
Установка кнопки по умолчанию на «Нет» для деструктивных операций — простой способ защитить пользователя от случайного подтверждения по Enter. Это общепринятая практика проектирования интерфейсов, а не требование платформы.
Типичные ошибки при работе с MessageBox
Разберём проблемы, которые чаще всего встречаются у новичков. Часть из них приводит к логическим ошибкам, часть — к неудобному поведению приложения.
- ⛔ Результат
Showигнорируется — действие выполняется при любом ответе - ⛔ Сравнение идёт с
DialogResult.OK, хотя окно содержит кнопки Yes/No — условие никогда не сработает - ⛔ MessageBox вызывается внутри цикла или обработчика Paint, из-за чего окна появляются многократно
- ⛔ Для опасного действия кнопкой по умолчанию оставлена «Да»
Отдельно стоит упомянуть владельца окна. Перегрузка MessageBox.Show(this, ...) позволяет привязать диалог к конкретной форме — тогда он гарантированно окажется поверх неё и не «провалится» за главное окно приложения.
⚠️ Внимание: MessageBox — это модальное синхронное окно. Пока оно отображается, выполнение кода приостановлено. Не вызывайте его из фоновых потоков без перехода в UI-поток через Invoke, иначе возможны ошибки межпоточного доступа.
Как изменить текст кнопок на свои значения
Стандартный MessageBox не позволяет менять подписи кнопок — они берутся из локализации Windows. Если нужны собственные надписи, создайте отдельную форму с кнопками и верните результат через свойство DialogResult формы, либо используйте сторонние библиотеки диалогов.
Аналоги в WPF и современных версиях .NET
В WPF используется свой класс System.Windows.MessageBox с похожим API: метод Show, перечисления MessageBoxButton.YesNo и MessageBoxResult.Yes. Синтаксис почти идентичен, но типы результата называются иначе — это частая причина путаницы при переносе кода из WinForms.
// WPF
MessageBoxResult result = MessageBox.Show(
"Продолжить?", "Вопрос",
MessageBoxButton.YesNo,
MessageBoxImage.Question);
if (result == MessageBoxResult.Yes) { / ... / }
В кроссплатформенных сценариях (консольные приложения, MAUI, Avalonia) стандартный MessageBox может быть недоступен или иметь другую реализацию. Перед использованием сверьтесь с документацией конкретного фреймворка и целевой версии .NET — поведение диалоговых окон зависит от платформы.
Часто задаваемые вопросы
Как узнать, что пользователь нажал «Нет»?
Сравните возвращаемое значение MessageBox.Show с DialogResult.No. Проще всего обернуть вызов в условие if (... == DialogResult.Yes) — тогда ветка else покроет и «Нет», и закрытие окна крестиком.
Можно ли переименовать кнопки «Да» и «Нет»?
Стандартными средствами MessageBox — нет: подписи берутся из языка операционной системы. Для произвольных надписей создают собственную форму-диалог с кнопками и возвращают результат через DialogResult.
Почему сравнение с DialogResult.OK не работает?
Окно с кнопками MessageBoxButtons.YesNo никогда не возвращает DialogResult.OK — только Yes или No. Проверяйте результат именно на эти значения.
Как сделать, чтобы диалог всегда был поверх главного окна?
Передайте ссылку на форму первым параметром: MessageBox.Show(this, "текст", "заголовок", MessageBoxButtons.YesNo). Диалог станет дочерним окном формы и не окажется под ней.
Работает ли MessageBox в консольном приложении?
В проекте на Windows можно подключить сборку System.Windows.Forms и вызвать MessageBox из консольного приложения, однако для кроссплатформенных решений этот способ не подходит — там используют ввод через консоль или специализированные библиотеки.