Я хочу добавить определенное поведение к нескольким формам. В этом случае это всплывающее сообщение, которое вызывается, когда поле не проходит проверку ввода. Самым простым решением, которое я мог придумать, было сделать его статическим классом и вызвать его в состоянии сбоя события onvalidate каждого поля.
public static class BalloonMessage
{
private static ToolTip _toolTip = new ToolTip()
{
Active = false,
IsBalloon = true
};
public static void Show(string message,Control control)
{
if (!_toolTip.Active)
{
//4 year old bug in tooltip doesn't place balloon "tail" correctly
// when first attached to a control. Microsoft still hasn't fixed it.
_toolTip.Show(message, control);
_toolTip.Active = true;
_toolTip.Show(message, control);
}
}
public static void Clear()
{
_toolTip.Active = false;
}
}
private void textBox1_Validating(object sender, CancelEventArgs e)
{
if (textBox1.Text.Contains(" "))
{
BalloonMessage.Show(String.Format("Field cannot contain spaces"), textBox1);
e.Cancel = true;
}
else
{
BalloonMessage.Clear();
}
}
Это позволяет мне использовать BalloonMessage в любой форме, не требуя явной зависимости, но Мне интересно, является ли это лучшим подходом . Пример кода не показывает его, но производственный код использует множество взаимосвязанных триад MVP. Проверка выполняется в докладчиках, которые не имеют прямого доступа ни к одному из элементов управления форм. Поэтому мне придется передать результат проверки и любое сообщение об ошибке обратно в представление для отображения в сообщении с сообщением.
Кстати, если вам интересно, почему я использую всплывающую подсказку вместо переноса EM_SHOWBALLOONTIP
, потому что я хотел, чтобы эта функция была включена в Windows 2000, а EM_SHOWBALLOONTIP
была добавлена в XP. Подсказка может отображаться в виде всплывающей подсказки в 2000 году, если установлен IE 5.5 или более поздней версии (все мои клиенты Win2K используют IE 6). Я просто держу его в неактивном состоянии до тех пор, пока не потребуется запретить его поведение по умолчанию при наведении .