How can I show message boxes with a «Ding!» sound and a red ‘close’ button in it? This is what I’m talking about:
I’m trying to create some custom errors and warnings, but this:
MessageBox.Show("asdf");
doesn’t seem to give me any customization options.
TylerH
20.7k65 gold badges73 silver badges98 bronze badges
asked Jan 21, 2010 at 13:21
Try this:
MessageBox.Show("Some text", "Some title",
MessageBoxButtons.OK, MessageBoxIcon.Error);
caiosm1005
1,6761 gold badge19 silver badges31 bronze badges
answered Jan 21, 2010 at 13:23
Andrew HareAndrew Hare
343k71 gold badges636 silver badges634 bronze badges
2
Try details: use any option:
MessageBox.Show(
"your message",
"window title",
MessageBoxButtons.OK,
MessageBoxIcon.Warning // for Warning
//MessageBoxIcon.Error // for Error
//MessageBoxIcon.Information // for Information
//MessageBoxIcon.Question // for Question
);
TylerH
20.7k65 gold badges73 silver badges98 bronze badges
answered Jun 30, 2015 at 12:21
MessageBox.Show(
"your message",
"window title",
MessageBoxButtons.OK,
MessageBoxIcon.Asterisk //For Info Asterisk
MessageBoxIcon.Exclamation //For triangle Warning
)
Antonio
19.3k12 gold badges98 silver badges195 bronze badges
answered Jul 8, 2015 at 12:35
You should add namespace if you are not using it:
System.Windows.Forms.MessageBox.Show("Some text", "Some title",
System.Windows.Forms.MessageBoxButtons.OK,
System.Windows.Forms.MessageBoxIcon.Error);
Alternatively, you can add at the begining of your file:
using System.Windows.Forms
and then use (as stated in previous answers):
MessageBox.Show("Some text", "Some title",
MessageBoxButtons.OK, MessageBoxIcon.Error);
answered Jun 28, 2018 at 14:15
TidesTides
11111 bronze badges
Время на прочтение
4 мин
Количество просмотров 18K
Приветствую!
В статье посвященной моему профайлеру для Entity Framework-a, я вкратце описал примененную мной форму для сообщения пользователю об исключительной ошибке в приложении. После оценки количества скачиваний примера кода, было решено выделить этот пример в отдельный проект, а также добавить поддержку WPF приложений.
Исходники библиотеки вместе с примерами опубликованы на CodePlex под свободной лицензией MIT: https://uiexceptionhandler.codeplex.com/
Подробности под катом.
Введение
Всем известно, что приложения периодически падают по самым разным причинам, при этом, крайне желательно показывать пользователю дружественное сообщение об ошибке в приложении, вместо стандартного сообщения Windows.
Что получилось
При подключенной библиотеке, в случае падения приложения будет показано следующие сообщение с просьбой добавить описание шагов которые привели к ошибке и свой email для ответа, при этом текст ошибки сохраняется в лог файл.
При клике по кнопке «Error detail information» выводиться дополнительная информация об ошибке:
Кнопка Debug позволяет подключить отладчик Visual Studio.
Кнопка «Send to Developer» отправляет письмо на почту разработчику. В случае ошибки отправки сообщения, пользователю будет предложено самому отправить лог файл разработчику на почту.
Отправленное разработчику сообщение придет в таком виде:
Использование
1. Забрать последнюю версию кода https://uiexceptionhandler.codeplex.com/SourceControl/latest
2. Собрать в Release mode.
3. Из папки «UIExceptionHandlerLibsDeploy» подключить в проект библиотеку UIExceptionHandlerWinForms.dll в случае WinForms приложения и UIExceptionHandlerWPF.dll в случае WPF приложения.
4. Инициализировать путем вызова статического метода с рядом параметров:
UIException.Start(
string serverSmtp,
int portSmtp,
string passwdSmtp,
string userSmtp,
string programmerEmail,
string fromEmail,
string subject
)
Как это работает
Статический метод UIException.Start подписывает метод HandleError на событие AppDomain.CurrentDomain.UnhandledException:
AppDomain.CurrentDomain.UnhandledException += (sender, e) => HandleError((Exception)e.ExceptionObject);
Метод HandleError:
private static void HandleError(Exception exception)
{
try
{
// запускаем обработчик формы и передаем ему ссылку на форму наследованную от интерфейса IErrorHandlerForm
new ErrorHandlerController(exception, new ErrorHandlerForm()).Run();
}
catch (Exception e)
{
// сохраняем ошибку в лог файл
LogHelper.Logger.Error(e);
// в случае ошибки обработки выводим сообщение с просьбой отправить лог файл разработчику на почту
MessageBox.Show("Error processing exception. Please send log file " + LogHelper.ExceptionLogFileName + " to developer: " + Settings.ProgrammerEmail + " rn Exception:" + e);
// спрашиваем нужно ли подключить отладчик
if (MessageBox.Show("Attach debugger? n Only for developer!!!", "Debugging...", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
{
Debugger.Launch();
throw;
}
}
finally
{
// обязательно завершаем приложение чтобы windows не вывела стандартное сообщение об ошибке
Environment.Exit(1);
}
}
Интерфейс IErrorHandlerForm:
public interface IErrorHandlerForm
{
event Action OnSendButtonClick;
event Action OnShowErrorLinkClick;
event Action OnLogFileLinkClick;
event Action OnDebugButtonClick;
// меняет высоту формы
void SetHeight(int height);
// задает подробное сообщение об ошибке
string ExceptionInfoText { get; set; }
// получает текст из поля дополнительной информации введенной пользователем
string ExceptionDetailText { get; set; }
// email пользователя для ответа
string ReplyEmail { get; }
void ShowExceptionInfoTextBox(bool isShow);
// выводит информационное сообщение
void ShowInfoMessageBox( string text, string caption);
// выводит диалоговое сообщение
bool ShowQuestionDialog( string text, string caption);
// показывает окно в режиме диалога! необходимо чтобы приложение дожидалось закрытия окна и завершилось в finaly
void ShowViewDialog();
void UpdateContactEmail(string contactEmail);
}
В качестве библиотеки для логгирования используется NLog. Для того чтобы избежать появления лишних xml файлов, вся конфигурация Nlog-а делается в коде:
private static void ConfigureNlog()
{
var config = new LoggingConfiguration();
var fileTarget = new FileTarget();
config.AddTarget("file", fileTarget);
fileTarget.Layout = @"${longdate} ${message}";
fileTarget.FileName = "${basedir}/" + ExceptionLogFileName;
var rule2 = new LoggingRule("*", LogLevel.Trace, fileTarget);
config.LoggingRules.Add(rule2);
LogManager.Configuration = config;
}
Чтобы добиться максимальной простой интеграции в проект, я решил все используемые сборки объединить в одну библиотеку. Делается это при помощи приложения ILMerge, путем добавления скрипта в post-build событие:
if $(ConfigurationName) == Release (
"$(SolutionDir)ILMergeILMerge.exe" /out:"$(SolutionDir)Deploy$(TargetFileName)" "$(TargetDir)*.dll" /target:dll /targetplatform:v4,C:WindowsMicrosoft.NETFramework64v4.0.30319 /wildcards
)
Послесловие
Данное решение было написано для достаточно крупного проекта, применяется уже более 2-х лет, значительно улучшив процесс исправления ошибок, поскольку о каждом падении приложения узнаешь моментально, без дополнительной нотификации от пользователя.
Надеюсь это все будет кому-то полезно!
Всем спасибо за внимание!
Приветствую всех, сегодня я покажу, как вывести диалоговое окно с сообщением пользователю, я частенько использую в своих программах. Да и порой под забываю какое именно мне нужно, и подсматриваю здесь.
Для начало создадим обычное приложение WinForm и разместим на нем кнопку при нажатии, на которое будем выводить сообщения.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System; using System.Windows.Forms; namespace Сообщения { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { } } } |
Для того что бы вывести обычно сообщения достаточно вписать в метод нажатия кнопки строку:
private void button1_Click(object sender, EventArgs e) { MessageBox.Show(«nookery.ru»); } |
MessageBox.Show имеет перегруженные варианты метода, следующий пример нам покажет, как отобразить окно сообщения с заданным текстом и заголовком.
private void button1_Click(object sender, EventArgs e) { MessageBox.Show(«nookery.ru», «Сайт»); } |
В следующем примере нам придется использовать MessageBoxButtons в качестве передаваемого аргумента. Однако он имеет несколько параметров:
- MessageBoxButtons.AbortRetryIgnore – Прервать | Повтор | Пропустить
- MessageBoxButtons.OK — ОК
- MessageBoxButtons.OKCancel — ОК | Отмена
- MessageBoxButtons.RetryCancel — Повтор | Отмена
- MessageBoxButtons.YesNo — Да | Нет
- MessageBoxButtons.YesNoCancel — Да | Нет | Отмена
Это нам позволит разместить в диалоговом окне сообщение кнопку или кнопки, в зависимости от параметров.
Рассмотрим все примеры с использованием кнопок:
Вариант AbortRetryIgnore
private void button1_Click(object sender, EventArgs e) { MessageBox.Show(«nookery.ru», «Сайт», MessageBoxButtons.AbortRetryIgnore); } |
Вариант OK
В этом варианте у нас ничего не измениться так как он используется по умолчанию, выводит кнопку Ok.
Вариант OKCancel
private void button1_Click(object sender, EventArgs e) { MessageBox.Show(«nookery.ru», «Сайт», MessageBoxButtons.OKCancel); } |
Вариант RetryCancel Диалоговое окно подходит для вывода сообщения пользователю с возможностью повторения какого-либо действия, имея в функционале диалогового окна две кнопки Повтор, Отмена.
private void button1_Click(object sender, EventArgs e) { MessageBox.Show(«nookery.ru», «Сайт», MessageBoxButtons.RetryCancel); } |
Вариант YesNo Диалоговое окно подходит для вывода сообщения пользователю с возможностью выбора, подтвердить или отказаться имя в функционале диалогового окна две кнопки Да, Нет.
private void button1_Click(object sender, EventArgs e) { MessageBox.Show(«nookery.ru», «Сайт», MessageBoxButtons.YesNo); } |
Вариант YesNoCancel Диалоговое окно подходит для вывода сообщения пользователю с возможностью выбора, подтвердить или отказаться имя в функционале диалогового окна три кнопки Да, Нет, Отмена.
private void button1_Click(object sender, EventArgs e) { MessageBox.Show(«nookery.ru», «Сайт», MessageBoxButtons.YesNoCancel); } |
Метод Show может принимать в качестве параметра изображения MessageBoxIcon которые позволяют устанавливать тип сообщения, и могут принимать следующие значения:
MessageBoxIcon.Error Диалоговое окно подходит для вывода сообщения пользователю об ошибке.
private void button1_Click(object sender, EventArgs e) { MessageBox.Show(«nookery.ru», «Сайт», MessageBoxButtons.OK, MessageBoxIcon.Error); } |
MessageBoxIcon.Information Диалоговое окно подходит для вывода сообщения пользователю о какой то информации.
private void button1_Click(object sender, EventArgs e) { MessageBox.Show(«nookery.ru», «Сайт», MessageBoxButtons.OK, MessageBoxIcon.Information); } |
MessageBoxIcon.None
Данные вариант стоит по умолчанию и не выводит никого изображения.
MessageBoxIcon.Question Диалоговое окно подходит для вывода сообщения пользователю о помощи.
private void button1_Click(object sender, EventArgs e) { MessageBox.Show(«nookery.ru», «Сайт», MessageBoxButtons.OK, MessageBoxIcon.Question); } |
MessageBoxIcon.Warning Диалоговое окно подходит для вывода сообщения пользователю об ошибке или опасности.
private void button1_Click(object sender, EventArgs e) { MessageBox.Show(«nookery.ru», «Сайт», MessageBoxButtons.OK, MessageBoxIcon.Warning); } |
MessageBoxIcon.Exclamation
private void button1_Click(object sender, EventArgs e) { MessageBox.Show(«nookery.ru», «Сайт», MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } |
MessageBoxIcon.Stop
private void button1_Click(object sender, EventArgs e) { MessageBox.Show(«nookery.ru», «Сайт», MessageBoxButtons.OK, MessageBoxIcon.Stop); } |
MessageBoxIcon.Asterisk
private void button1_Click(object sender, EventArgs e) { MessageBox.Show(«nookery.ru», «Сайт», MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } |
MessageBoxIcon.Hand
private void button1_Click(object sender, EventArgs e) { MessageBox.Show(«nookery.ru», «Сайт», MessageBoxButtons.OK, MessageBoxIcon.Hand); } |
Для того что бы сохранить полученный результат после нажатия кнопки, нам достаточно создать переменную класса DialogResult
DialogResult может принимать следующие значения:
- DialogResult.Abort — Прервать
- DialogResult.Cancel — Отмена
- DialogResult.Ignore — Пропустить
- DialogResult.No — Нет
- DialogResult.Yes — Да
- DialogResult.OK — ОК
- DialogResult.Retry — Повтор
DialogResult resualt= MessageBox.Show(«nookery.ru», «Сайт», MessageBoxButtons.YesNo); |
А что бы посмотреть, что хранить переменная resualt мы можем вывести ее в сообщении:
MessageBox.Show(resualt.ToString()); |
В моем примере я нажал на кнопку Да и вывелось сообщения
В этих примерах мы рассмотрели возможность вывода сообщений пользователю, на основе диалоговых окно в WinForm.
0 / 0 / 0 Регистрация: 16.05.2016 Сообщений: 8 |
|
1 |
|
Вывести окно с ошибкой при вводе пользователем некорректного выражения16.05.2016, 06:47. Показов 13716. Ответов 1
Здравствуйте.
0 |
AndreyVorobey 2728 / 1644 / 870 Регистрация: 14.04.2015 Сообщений: 5,611 |
||||
16.05.2016, 16:07 |
2 |
|||
Сообщение было отмечено Zerroo как решение Решение
1 |
Последнее обновление: 09.11.2016
ErrorProvider не является полноценным визуальным компонентом, тем не менее он позволяет настраивать визуальное отображение ошибок при вводе
пользователя. Этот элемент применяется преимущестенно для проверки и индикации ошибок.
Так, определим на форме два текстовых поля с именами nameBox и ageBox. И далее перетащим с панели инструментов на форму элемент ErrorProvider.
ErrorProvider оторазится под формой, а в окне свойств мы также сможем управлять его свойствами:
Среди его свойств можно выделить следующие:
-
BlinkRate: задает частоту мигания значка ошибки
-
BlinkStyle: задает, когда значок ошибки будет мигать
-
Icon: устанавливает сам значок ошибки. По умолчанию это красный кружок с восклицательным знаком, но можно установить любую
другую иконку.
В коде формы приложения пропишем следующее:
using System; using System.ComponentModel; using System.Windows.Forms; namespace HelloApp { public partial class Form1 : Form { public Form1() { InitializeComponent(); nameBox.Validating += nameBox_Validating; ageBox.Validating += ageBox_Validating; } private void nameBox_Validating(object sender, CancelEventArgs e) { if (String.IsNullOrEmpty(nameBox.Text)) { errorProvider1.SetError(nameBox, "Не указано имя!"); } else if (nameBox.Text.Length < 4) { errorProvider1.SetError(nameBox, "Слишком короткое имя!"); } else { errorProvider1.Clear(); } } private void ageBox_Validating(object sender, CancelEventArgs e) { int age = 0; if (String.IsNullOrEmpty(ageBox.Text)) { errorProvider1.SetError(ageBox, "Не указан возраст!"); } else if (!Int32.TryParse(ageBox.Text, out age)) { errorProvider1.SetError(ageBox, "Некорретный возраст!"); } else { errorProvider1.Clear(); } } } }
Здесь для обоих текстовых полей задано событие Validating, которое срабатывает при вводе пользователя и призвано управлять валидацией вода. Это событие
имеется и у других элементов управления, не только у текстовых полей. В обработчике события Validating мы смотрим на введенный текст, и если он не удовлетворяет условиям,
то с помощью метода errorProvider1.SetError()
для определенного элемента добавляем ошибку. Если все условия соблюдены, то, наоборот, удаляем все ошибки
с помощью метода errorProvider1.Clear()
.
Запустим приложение и при некорректном вводе мы увидим ошибку:
Здесь есть небольшая деталь — валидация элемента будет происходить, когда мы завершим ввод и перейдем на другой элемент. Если же нам надо валидировать
элемент по мере ввода, то тогда мы можем обрабатывать событие TextChanged у тех же текстовых полей.