Вы также можете извлечь логику для одного текстового поля в нечто вроде:
private bool Validated<T>(Control tb, out T value)
{
try
{
value = return (T)Convert.ChangeType(tb.Text, typeof(T));
return true;
}
catch
{
value = default(T);
tb.Text = "";
return false;
}
}
, которое вы можете просто использовать как:
if (!Validated<int>(txtXPos, out val1) ||
!Validated<int>(txtYPos, out val2) ||
!Validated<double>(txtSpeed, out speed) ||
!Validated<int>(txtDirection, out direction))
{
MessageBox.Show("Validation failed");
}
[Редактировать]
Кроме того, очистка текстовых полей - плохая идея с точки зрения удобства использования, особенно внутри события TextChanged
.Я не хотел бы, чтобы мое текстовое поле очищалось, если я случайно наберу письмо внутри.Намного лучше было бы использовать ErrorProvider или незаметно указать, что ввод неправильный каким-либо другим способом.
[Edit2]
Преобразование из строки в примитивные типывозможно с помощью Convert.ChangeType, но вы можете предоставить любой метод преобразования, который вам нравится, если вам нужно проанализировать более сложную строку в свой собственный класс:
private bool Validated<T>(Control tb, Func<string, T> converter, out T value)
{
try
{
value = converter(tb.Text);
return true;
}
catch
{
value = default(T);
tb.Text = "";
return false;
}
}
И затем использовать его следующим образом:
if (!Validated<int>(txtXPos, Convert.ToInt32, out val1) ||
!Validated<int>(txtYPos, Convert.ToInt32, out val2) ||
!Validated<double>(txtSpeed, Convert.ToDouble, out speed) ||
!Validated<int>(txtDirection, Convert.ToInt32, out direction))
{
MessageBox.Show("Validation failed");
}
Таким образом, вы можете передать любой делегат с подписью Func<string, T>
, который будет выполнять фактическое преобразование, или вызвать исключение в случае сбоя.