VirtualStringTree — любой способ определить, когда была проверена коллекция узлов?

У меня есть VST, использующий TriStateChecking. Это связано с таблицей базы данных, поэтому, когда пользователь проверяет узел, его отмеченное поле обновляется в базе данных. Я бы хотел, чтобы это было незаметно для конечного пользователя; это не кнопка "Сохранить".

В настоящее время я использую событие OnChecked() для обновления базы данных. Проблема заключается в том, что при проверке большого количества узлов выполняются операторы обновления #CheckedNodes SQL. Что я хотел бы сделать, так это захватить/получить уведомление, когда вся проверка три состояния завершена, чтобы я мог просто сканировать дерево и построить один оператор обновления SQL.

Есть ли событие, которое я мог бы использовать после завершения проверки всех трех состояний?


person Simon    schedule 08.03.2011    source источник
comment
Что вы имеете в виду под завершением проверки всех трех состояний? В virtualstringtree IIRC нет такой возможности одновременно проверять несколько узлов. Если вы проверяете несколько узлов в своей процедуре или функции, вы можете использовать список для хранения проверенных узлов, как я указал в своем ответе.   -  person Linas    schedule 08.03.2011
comment
Я не уверен, хотите ли вы этого, но если вы хотите запустить обновление SQL после того, как пользователь установил все флажки из неопределенного состояния в определенное, вы можете сохранить только количество неопределенных состояний проверки. Вы просто установите эту переменную в число узлов после загрузки. И в событии OnChecked вы уменьшите эту переменную, и если вы достигнете 0, вы просто выполните итерацию по дереву, создадите и запустите свой оператор SQL.   -  person    schedule 08.03.2011


Ответы (3)


Просто имейте внутренний список, в котором вы можете хранить проверенные узлы, а событие onChecked обновляет список. При проверке большого количества узлов просто выполните итерацию по списку и создайте оператор SQL.

person Linas    schedule 08.03.2011
comment
Это может сработать, но на самом деле я после момента времени, когда я знаю, когда все узлы завершили проверку. Кажется, этого может не быть. - person Simon; 08.03.2011
comment
Событие OnChecked запускается при изменении состояния проверки. Так почему бы вам просто не использовать некоторую переменную, которая по умолчанию будет общим количеством ваших узлов, а в событии OnChecked вы просто уменьшите ее значение. Когда вы достигнете 0, вы можете быть уверены, что все ваши узлы изменят свое состояние. - person ; 09.03.2011

Нет, итерация - единственный способ сделать это. Даже свойство CheckedCount делает это таким образом.

person Community    schedule 08.03.2011

Просто делаю несколько тестов, но похоже, что я могу просто использовать событие OnMouseUp(). Надо было, наверное, проверить раньше, упс.

person Simon    schedule 08.03.2011
comment
Да, конечно. Вы можете использовать OnMouseUp, который запускает OnChecked (или, точнее, DoCheckClick), как вы узнаете. Но OnMouseUp будет срабатывать всякий раз, когда вы нажимаете на узел. Событие OnChecked срабатывает при поднятии мыши только в том случае, если вы отпустите кнопку мыши над тем флажком узла, на котором вы нажали. Поэтому, если вы ищете событие, которое срабатывает после изменения состояния проверки, используйте метод OnChecked. Изменение состояния проверки ЗАВЕРШЕНО. - person ; 08.03.2011
comment
Не используйте событие мыши, по крайней мере, само по себе. Вы пропустите узлы, которые проверяются другими способами, такими как клавиатура. - person Rob Kennedy; 08.03.2011
comment
Хороший вопрос Роб, не подумал об этом. Мне придется пересмотреть. - person Simon; 08.03.2011