BeforeExpand срабатывает несколько раз в Treeview - PullRequest
0 голосов
/ 29 декабря 2011

У меня серьезная досадная проблема, на которую я тратил смехотворное количество времени, пытаясь решить ее, но до сих пор безрезультатно !!

За эти годы я никогда не использовал стандартное древовидное представление, которое поставляется с .NET, поскольку я всегда использовал сторонний компонент, но пока говорю о неудачном опыте !!!

Короче говоря, я загружаю свои диски, а затем при расширении диска я перечисляю папки и так далее ... Ничего нового здесь, но у меня есть 2 основные проблемы:

  1. Когда все ветки свернуты, дважды запускается событие до и после расширения. BeforeExpand x 2, затем AfterExpand x 2.

  2. Когда раскрываются несколько ветвей, это вызовет событие 2 для каждой развернутой ветви ... Как будто я вызываю какой-то рекурсивный код, когда я не ... Так, например,

Развернуть C -> Триггеры BeforeExpand x 2, затем AfterEvent x 2 - Оставить его развернутым

Развернуть E -> Триггеры BeforeExpand x 2 для E, затем AfterEvent x 2, а затем делает это снова для C - Оставьте E расширенным.

Разверните F -> Триггеры BeforeExpand x 2 для F, затем AfterEvent x 2, затем сделайте это снова для E, затем C.

Это не имеет смысла !!

Код мудрый:

  1. Инициализируйте BeforeExpand и AfterExpand, когда моя форма инициализируется, т.е.

        treeView1.BeforeExpand += new TreeViewCancelEventHandler(treeView1_BeforeExpand);
        treeView1.AfterExpand += new TreeViewEventHandler(treeView1_AfterExpand);
    
  2. Когда я раскрываю узел, вызывается фоновый поток, который загружает диски или папки. Из фонового рабочего потока я вызываю функцию, которая обрабатывает проблему кросс-потоков, снова вызывая делегат, ничего особенного

У меня нет идей относительно того, что является причиной того, что этот бар может быть ошибкой со стороны MS, но я сомневаюсь в этом ... Это похоже на проблему, которая слишком очевидна.

Я рад опубликовать свой код, если это необходимо, так как это было просто фиктивное тестовое приложение, которое я запустил, и, возможно, вы заметите что-то, что я сделал неправильно, но я просто не вижу, что.

Надеюсь, кто-то имеет представление о том, что вызывает это.

Спасибо.

Thierry.

1 Ответ

1 голос
/ 30 декабря 2011

Я понял, в чем проблема, поэтому я решил поделиться ею на случай, если это случится с кем-то еще !!

Это безумие, но в фоновом рабочем потоке я вызвал treeview1.Sort () в RunWorkerCompleted, и это то, что вызывает события beforeExpand и afterExpand несколько раз!После удаления он вел себя соответствующим образом.

Полагаю, сначала я отсортирую папки, а затем вызову делегата из потока, чтобы обновить пользовательский интерфейс с отсортированным списком.

Вот и все!

...