возникает необходимость проверки введенных пользователем данных и вывода уведомления на экран в случае некорректного ввода. Я использовал следующий метод, но мне кажется, что он не совсем вписывается в принцип "не повторяйся". Есть ли у кого идеи по упрощению?
int productid = 0;
string errorMessage = "Неправильный формат данных:\n",
productName = "", productGroup = "", productType = "";
if (!int.TryParse(ProductIdTB.Text, out productId))
{
errorMessage += "+ Номер продукта\n";
}
if (string.IsNullOrEmpty(ProductNameTB.Text))
{
errorMessage += "+ Название продукта\n";
}
else
{
productName = ProductNameTB.Text;
}
if (string.IsNullOrEmpty(ProductGroupTB.Text))
{
errorMessage += "+ Группа продукта\n";
}
else
{
productGroup = ProductGroupTB.Text;
}
if (string.IsNullOrEmpty(ProductType.Text))
{
errorMessage += "+ Вид продукта";
}
else
{
productType = ProductType.Text;
}
if (errorMessage.Split(' ').Length > 1)
{
MessageBox.Show(errorMessage);
return;
}
Возможно, вы захотите удалить все биты else и просто заполнить значения только после последнего условия, когда вы знаете, что ошибок нет.
@DonMiguelSanchez Нет, OP использует +=, таким образом добавляя переменную сообщения об ошибке, не перезаписывая ее ...
В мире ASP.NET у нас есть связыватели модели и атрибуты проверки, которые выполняют все основные проверки ввода, поэтому нам не нужно этого делать.
Вместо разделения на ' ' вы, вероятно, захотите разделить на '\n'. А еще проверка с > 1 не сработает, так как вы уже добавляете \n к заголовку, поэтому разбиение всегда будет давать вам как минимум два элемента. Кроме того, я бы предложил не отображать такой большой объем данных в текстовом поле. Есть лучшие средства проверки и отображения ошибок в Windows Forms...
@derpirscher, но это работает...
Что произойдет, если ошибок не будет? Тогда errormessage все еще "Неправильный формат данных:\n", то есть содержит 2 пробела, а errormessage.Split(' ') приведет к массиву длины 3. Таким образом, ваше окно сообщений всегда будет отображаться
WPF уже покрывает это с помощью проверки данных, предлагая способы указать правила проверки в форме или объекте, автоматически запускать их при изменении значения и отображать индикаторы ошибок.
@derpirscher я вижу, я должен использовать 3, да, просто не заметил





Я могу представить создание класса, который выполняет проверки за вас и собирает все ошибки либо в виде строки, либо в виде списка строк.
class ErrorMessageBuilder
{
string totalmessage = "";
void AppendErrorIfEmpty(TextBox t, string textboxname)
{
if (t.Text.IsNullOrEmpty())
{
totalmessage += textboxname + " can't be empty" + Environment.NewLine;
}
}
void AppendErrorIfNotInt(TextBox t, string textboxname)
{
int value;
if (!int.TryParse(t.Text, out value))
{
totalmessage += textboxname + " must be an integer number" + Environment.NewLine;
}
}
}
Это уменьшит код до
var emb = ErrorMessageBuilder();
emb.AppendErrorIfNotInt(ProductIdTB, "Product ID");
emb.AppendErrorIfEmpty(ProductNameTB, "Product Name");
...
Поскольку для меня это похоже на разработку WinForms, вы также можете взглянуть на класс ErrorProvider. Как и в случае с всплывающими подсказками, он допускает одно сообщение об ошибке для каждого элемента управления. Возможно, это было бы даже удобнее.
Хорошая идея, воспользуюсь
В зависимости от того, насколько это используется, оно может не очень хорошо масштабироваться, учитывая неизменность строк. Для каждого += вы создаете новый экземпляр строки, чем больше строка, тем больше памяти и мусора...
Рассмотрим StringBuilder и его методы Append/AppendFormat.
+=/concat, производительность строки
да, но я использую +=, разве это не добавляет строку вместо создания новой?
@programMUSTer: нет, он по-прежнему создает новую строку и избавляется от старой. Пока у вас нет килобайтов строк, нормальный подход с += вполне подойдет.
Базовый вопрос мнения не для stackoverflow.com, тем не менее вы перезаписываете свою переменную с каждым условием if else, поэтому, если у вас есть две ошибки, вы сможете читать только одну за раз, возможно, вы можете сгруппировать свои ошибки в несколько разных путь, или, может быть, бросить исключение