Я хочу использовать событие Validating на этикетке в VB.Net (Visual Studio 2005, .Net Runtime 2.0).
У меня есть два текстовых поля рядом. Они предназначены для разделения% /% распределения, такого как 80/20, 50/50 и т. д. Итак, у меня есть проверка для каждого поля, чтобы гарантировать, что их значения> = 0 и <= 100. Я хочу, чтобы метка слева от текстовых полей имеет собственную проверку, которая гарантирует, что два значения текстовых полей составляют ровно 100.
Я знаю, что могу сделать это в отдельном текстовом поле Проверка события. Я просто не хочу такого поведения. Я бы предпочел иметь дискретное сообщение в каждом текстовом поле, в котором говорилось бы, что его содержимое находится за пределами допустимой области значений, и иметь сообщение об ошибке на ярлыке, если их общее количество не равно 100.
Проблема в том, что, несмотря на установку CausesValidation = True в элементах управления Label, их события Validating не срабатывают. Даже ручной вызов Me.ValidateChildren () на уровне формы не вызовет событие для меток.
Есть идеи?





Могу я спросить, это веб-проект или проект формы?
Пользователь не может вводить какие-либо данные в метку, поэтому я не понимаю, почему они запускают проверку.
Обратите внимание на событие «текст изменен», я думаю, вы неправильно понимаете использование проверки в случае элементов управления.
В методе, который обрабатывает событие «текст изменен» для tb1, вы можете поместить код, который при редактировании значения изменения в tb2 дополняет 100, и наоборот, редактирование tb2 вызовет автоматическое изменение в tb1. Вы также можете добавить в этот обработчик событий реакцию на неправильные значения.
заботиться
Соответственно, я хочу разместить логику проверки на этикетке, которая находится рядом с двумя элементами управления, о которых я написал. Однако, несмотря на наличие всех свойств и событий, связанных с проверкой, событие Validating не запускается для меток даже при вызове Me.ValidateChildren () в форме.
Согласно документации для CausesValidation:
«Получает или задает значение, указывающее, вызывает ли элемент управления проверку, которая должна выполняться для любых элементов управления, требующих проверки при получении фокуса».
В моем собственном тестировании мне пришлось специально вызвать Label.Focus (), а затем выйти из этого поля (или вызвать другой control.Focus ()), чтобы событие сработало.
Я действительно думаю, что вы используете неправильную методологию для получения желаемых результатов. Я думаю, было бы лучше, чтобы валидаторы в текстовом поле вызывали служебный метод, который соответствующим образом установит метку.
события проверки предназначены для элементов управления, которые имеют редактируемые значения. метки не имеют редактируемых значений.
ваша ситуация не редкость, у вас есть проверка на уровне поля, которая говорит «положительное целое число», и бизнес-правило, которое гласит, что сумма значений A и B должна равняться 100%.
один из способов справиться с этим - отложить выполнение бизнес-правила до тех пор, пока форма не будет заполнена; это повлечет за собой проверку бизнес-правила, когда пользователь нажимает кнопку ОК (или кнопку Отправить в веб-форме).
если вам нужна мгновенная проверка, просто попросите метод проверки для обоих полей вызвать метод проверки бизнес-правила
Я знаю, что есть 50 способов сделать это. Я использую встроенную проверку в CLR. Таким образом, у меня есть проверка для каждого элемента управления вводом, такого как текстовые поля. Чтобы использовать это, вы размещаете код в событии Validating. Это не «неправильно», и «текст изменен» - не то место, где я могу делать то, что я хочу.