none
Как лучше отследить изменения в объекте TextBoxBase RRS feed

  • Вопрос

  • Приветствую, вопрос в следующем:

    Используется TextBoxBase вместе с TreeView, при выборе узла - меняется содержимое TextBoxBase. Нужно отслеживать пользовательский ввод в боксе, для этого использую событие TextChanged, но оно срабатывает и при не пользовательском вводе (при выборе узла, перезагрузке файла и т.п.). Поэтому добавил булевую переменную, и проверку на неё в событии TextChanged, т.е. весь код понатыкан присваиваниями этой переменной значения, включающего или отключающего обработку содержимого события TextChanged. Если где-то забыл воткнуть такое, то появляется баг.

    Смог придумать только использование Enter и Leave событий, но это решит проблему только частично.

    Может есть какой-нибудь более удобный способ?

    Заранее благодарю.

Ответы

  • На вскидку:

    Подпишитесь сами на TextChanged. Создайте свое событие TextDefinitelyChanged Из TextChanged обработчика вызывайте TextDefinitelyChanged если текст точно изменился.

    В нужных местах кода подпишитесь на конечное события TextDefinitelyChanged.

    Для этого вам нужно будет расширить базовый класс - унаследоваться от TextBoxBase.



    Don't forget to mark the correct answer Blog
    • Помечено в качестве ответа Kenaut 10 мая 2011 г. 5:42
  • Можно перед программным изменением текстбокса отписываться от обработчика события TextChanged и подписываться вновь, но это практически такое ж решение что и с булевой переменной.

    Можно воспользоваться событиями фокуса - GotFocus и LostFocus и в них либо изменять булевую переменную, которая в дальнейшем будет проверятся в TextChanged, либо отписываться/подписываться на это событие. Это проще, чем везде вставлять проверки.


    Для связи [mail]
    • Помечено в качестве ответа Kenaut 10 мая 2011 г. 5:42

Все ответы

  • На вскидку:

    Подпишитесь сами на TextChanged. Создайте свое событие TextDefinitelyChanged Из TextChanged обработчика вызывайте TextDefinitelyChanged если текст точно изменился.

    В нужных местах кода подпишитесь на конечное события TextDefinitelyChanged.

    Для этого вам нужно будет расширить базовый класс - унаследоваться от TextBoxBase.



    Don't forget to mark the correct answer Blog
    • Помечено в качестве ответа Kenaut 10 мая 2011 г. 5:42
  • Oleksandr Reminnyi, благодарю за помощь, попробую разобраться в вашем предложении.

    А может ещё кто-нибудь сталкивался с подобной помойму достаточно тривиально задачей? Так сказать, интересует как на практике обычно это реализуется...

  • Можно перед программным изменением текстбокса отписываться от обработчика события TextChanged и подписываться вновь, но это практически такое ж решение что и с булевой переменной.

    Можно воспользоваться событиями фокуса - GotFocus и LostFocus и в них либо изменять булевую переменную, которая в дальнейшем будет проверятся в TextChanged, либо отписываться/подписываться на это событие. Это проще, чем везде вставлять проверки.


    Для связи [mail]
    • Помечено в качестве ответа Kenaut 10 мая 2011 г. 5:42
  • Abolmasov Dmitry, спасибо, пока я сделал так: в событии TextChanged текст из бокса записывается в поле объекта, а в событии ModifiedChanged объект добавляется в список для последующей записи в файлы, вроде работает без багов, и нет необходимости отслеживать булевую переменную, единственное - после сохранения изменений (по кнопочке) пришлось принудительно поле Modified ставить в false, но это гораздо красивей, чем первый вариант.