я проверяю пользовательские элементы управления вводом, такие как текстовые поля и выпадающие списки. У меня проблема в том, что проверка (container.Validate ()) останавливается после нахождения первого недопустимого элемента управления. Я ожидал, что он проверит все элементы управления, прежде чем он вернется. Я хочу отобразить пользователю все недействительные элементы управления одновременно, а не по одному. Есть ли способ сделать это?
(использование wx.WS_EX_VALIDATE_RECURSIVELY будет распространяться на дочерние элементы, но только если никакой другой элемент управления не был ранее недействительным)
Редактировать:
Вместо того чтобы перезаписывать Validate () для каждого элемента управления, я решил использовать отдельную функцию, которая перебирает все дочерние элементы и проверяет их.
Примечание: эта функция не будет вызываться по умолчанию OnOK
событие. Для этого обработчик события должен быть восстановлен.
def ValidateRecursively(control):
'''Validate this control and its children recursively'''
validator = control.GetValidator()
# no validator -> valid
isValid = validator.Validate(control) if validator else True
for childControl in control.GetChildren():
# only validate enabled controls
if childControl.IsEnabled():
isValid &= ValidateRecursively(childControl)
return isValid
Для этого вам нужно переопределить Validate()
в вашем диалоговом окне и обойдите все элементы управления самостоятельно, не останавливаясь на первом неверном элементе, как это делает реализация базового класса.
К сожалению, вам, вероятно, потребуется продублировать код здесь так как нет возможности использовать его повторно. На яркой стороне, вы можете использовать его почти так же, как просто с изменением return false
строки, чтобы запомнить ошибку и вернуть ее в конце.
Других решений пока нет …