.NET, определяющий значение элемента управления, изменен и доработан

Все элементы управления предлагают какое-либо событие, чтобы указать, что значение было изменено. Например, когда вы входите в текстовое поле и начинаете печатать с каждым нажатием клавиши, возникает событие TextChanged. При открытии поля со списком и выборе нового элемента в раскрывающемся списке вы получаете событие SelectedIndexChanged.

Проблема в том, что во многих случаях события изменения сигнализируют о серии изменений, представляющих некое промежуточное незавершенное состояние. например Когда пользователь вводит свой почтовый индекс, нет причин искать город и штат или даже пытаться проверить его, пока пользователь не завершит ввод. Когда пользователь фокусируется на комбинации способов доставки и нажимает клавиши вверх/вниз для навигации по значениям комбинации, пытаясь найти нужную ему комбинацию, нет причин предполагать, что метод доставки был указан, и, таким образом, применять его к выставленный счет. Возможно, имеет смысл подождать, пока он не покинет поле со списком после просмотра значений, чтобы сигнализировать о том, что выбран способ доставки. Мы не хотим, чтобы нас беспокоила череда промежуточных состояний.

В нашем магазине мы реализовали событие Finalized, которое запускается только тогда, когда пользователь начинает вносить какие-либо изменения вручную (в отличие от программных изменений, таких как установка почтового индекса из БД), а затем завершает работу. Это событие Finalized нужно было обрабатывать по-разному для разных элементов управления; Я не знаю каких-либо функций .NET, которые упростили бы это.

Единственная идея, которая у меня сейчас есть, это попытаться использовать что-то вроде Rx ( функциональное реактивное программирование), чтобы приспособиться к этому. Любая идея для простого подхода .NET, который облегчил бы это?


person Mario    schedule 11.12.2013    source источник
comment
Вы точно знаете, что пользователь завершил ввод, только когда он переключает фокус на другой элемент управления. Например, ввести текст в другое поле или нажать кнопку «ОК». Итак, вас интересует событие Leave. Событие Validating специально разработано для этого.   -  person Hans Passant    schedule 12.12.2013
comment
Это действительно зависит от приложения. Карты Google красиво предоставляют раскрывающийся список, элементы которого фильтруются при каждом нажатии клавиши. Я также использовал таймер, который сбрасывался при каждом нажатии клавиши и по достижении некоторого количества секунд запускал событие, которое вызывало запрос к базе данных.   -  person djv    schedule 12.12.2013
comment
Проверка работает нормально. Хотя это вводящее в заблуждение название. То, как мы его используем, не имеет ничего общего с проверками. Мы просто ждем завершения взаимодействия с пользователем, прежде чем делать что-то динамическое с его вводом.   -  person Mario    schedule 16.12.2013


Ответы (2)


Для текстового поля почтового индекса вы можете использовать событие leave (происходит, когда текстовое поле теряет фокус), или в событии textchanged вы можете использовать оператор if:

if ziptextbox.text.length = 5 then
    'Hooray! do stuff here
end if

И вы также можете просто использовать событие leave для поля со списком

person jlynch630    schedule 23.12.2013

События Validating и Validated работают нормально; однако имена вводили в заблуждение, и поэтому мне никогда не приходило в голову, что они подходят.

Вся заслуга Ханса Пассанта за его комментарий, который решил эту проблему для меня. (Ганс перенаправит вам кредит, если вы ответите.)

person Mario    schedule 26.12.2013