Проверка нескольких текстовых полей в форме окна C # одновременно - PullRequest
10 голосов
/ 24 декабря 2009

У меня есть форма с несколькими текстовыми полями и другими элементами управления. Я использую элемент управления errorprovider и проверил событие проверки в каждом текстовом поле, которое мне нужно проверить. Событие Validating наступает, когда элемент управления передает фокус другому элементу управления. Таким образом, событие происходит, когда вы используете клавишу табуляции, чтобы отойти от текущего элемента управления, или когда вы щелкаете мышью по другому элементу управления 1 . И я нахожу это очень раздражающим, просто для примера, если я открою эту winform, а затем сразу попытаюсь закрыть ее, она не позволит мне, потому что проверка вызовет жалобу на то, что в первом текстовом поле нет введенного текста.

Я хочу использовать поведение провайдера ошибок, как я могу проверить всю форму только тогда, когда я нажму кнопку Сохранить формы?

Спасибо

Ответы [ 4 ]

10 голосов
/ 24 декабря 2009

Проверьте свойство Form.AutoValidate .

Возможные значения:

  • Отключить

Неявная проверка не произойдет. Установка этого значения не будет мешать явным призывам к Утвердить или проверить детей.

  • EnablePreventFocusChange

Неявная проверка происходит, когда управление теряет фокус.

  • EnableAllowFocusChange

Неявная проверка происходит, но если проверка не пройдена, фокус все равно перейти на новый контроль. Если проверка не пройдена, событие Validated не будет стрелять.

Установка его на EnableAllowFocusChange решит проблему открытия формы и немедленной попытки закрыть ее, так как фокус будет перенесен на кнопку Отмена.

Если вы хотите получить полный контроль над валидацией, вы можете установить его на Disable и выполнить ручную валидацию, используя Form.Validate и Form.ValidateChildren. Я не уверен на 100%, но считаю, что Form.ValidateChildren не будет вызывать события проверки для элементов управления, помещенных в TabControl.

1 голос
/ 02 июня 2011

Просто чтобы сохранить это обновление, как сказал Жоао Анджело, Form.ValidateChildren () не будет запускать проверку элементов управления внутри, скажем, GroupBox или TabControl.

Однако вы можете передать ValidationContraints перегруженному ValidateChildren (ValidationConstraints) методу и установить для него значение None, которое:

«Проверяет все дочерние элементы управления и все дочерние элементы этих дочерних элементов управления независимо от настроек их свойств.»

1 голос
/ 24 декабря 2009

Установите для свойства CausesValidation всех элементов управления (кроме кнопки «Сохранить») значение False. Это подавит событие Validating для всех элементов управления, кроме кнопки. Это может быть не тот, какой вы хотите, поскольку раздражающее поведение будет происходить, когда вы меняете фокус на кнопке, но я думаю, оно близко к тому, что вы хотите.

Другой вариант, если это не сработает, - это циклически проходить по элементам управления при нажатии кнопки и проверять их вручную по одному ...

Вот ссылка MSDN: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.causesvalidation.aspx

0 голосов
/ 24 декабря 2009

Нет способа заставить WinForms проверить элементы управления при сохранении. В отличие от веб-формы, здесь нет события «отправить» или «сохранить» (по крайней мере, в форме). Вы можете запрограммировать форму так, чтобы она действовала таким образом, но вы не сможете использовать привязку данных (сохранение установит модель и проверит ошибки).

Возможно, лучший способ - не использовать диалоговое окно для отображения ошибок (я предполагаю, что это так, поскольку вы говорите, что это проблема с закрытием формы). Всплывающие подсказки могут обеспечить лучшее взаимодействие с пользователем. Если пользователь игнорирует всплывающие подсказки, вы можете открыть диалоговое окно, когда они нажимают кнопку Сохранить. Они смогут закрыть форму, даже если есть неверные данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...