2011-12-29 2 views
0

私は真剣に迷惑な問題を抱えていますが、解決しようとするとばかげた時間を費やしていました。BeforeExpandがツリービューで複数回トリガーされました

私はいつもサードパーティ製のコンポーネントを使用していましたが、これまでに悪い経験を話していたように、.NETに付属する標準のツリービューを使ったことはありませんでした。要するに

、私は私のドライブをロードしていないんだし、ドライブを展開するときに、私は、フォルダを一覧表示する、というように...ここで新しい何が、私は2つの主要な問題抱えている:

  1. をすべてのブランチが折りたたまれると、beforeとafterの2回の展開イベントがトリガされます。BeforeExpand x 2、AfterExpand x 2。

  2. 複数のブランチが展開されると、展開された各ブランチに対してイベント2がトリガーされます。それは私がそうでないときに私は再帰的コードのいくつかの並べ替えを呼び出すようだ...だから、例えば

Cを展開 - > BeforeExpand X 2、次いでAfterEvent X 2トリガ - > EためBeforeExpand X 2をトリガし、その後、X 2 AfterEventは、次いで、Cのために再びそれをしない - - ままEを展開

を拡大し、それを残しますEは拡大した。

Fを展開 - > FのためBeforeExpand×2をトリガし、その後、AfterEvent×2、そしてC.

は、それは意味がありません。そして、Eのために再びそれをしません!賢い

コード:

  1. は私がノードを展開すると、バックグラウンドスレッドが呼び出されると、ドライブやフォルダをロードするのいずれかされBeforeExpandとAfterExpand私のフォームは、すなわち初期化

    treeView1.BeforeExpand += new TreeViewCancelEventHandler(treeView1_BeforeExpand); 
        treeView1.AfterExpand += new TreeViewEventHandler(treeView1_AfterExpand); 
    
  2. を初期化します。バックグラウンドワーカースレッドから、私はそうもう一度デリゲートを呼び出すことにより、クロススレッドの問題を処理する関数、私は実際にそれができると、このバーを引き起こしているものへとアイデアの出だ

何も特別なを呼び出しますMS側のバグかもしれないが、私はそれを疑う...それはあまりにも明白な問題のように感じる。

これはちょうど私が始めたダミーのテストアプリだったので、必要ならば私のコードを投稿して嬉しいです。私は間違ったことをしたかもしれませんが、何が見えないのか分かりません。

誰かがこれを引き起こしていることについてのヒントを期待しています。

ありがとうございました。

Thierry。

答えて

0

私は問題が何であるかを考え出したので、これが他の誰かに起こった場合に備えて、私はそれを分かち合うと思った!!

これは非常識ですが、バックグラウンドのワーカースレッドでは、RunWorkerCompletedでtreeview1.Sort()を呼び出しました。これがbeforeExpandイベントとafterExpandイベントを複数回呼び出す原因になります。一度削除すると、それに応じて動作します。

私は最初にフォルダをソートしてから、ソートされたリストでUIを更新するためにスレッドからデリゲートを呼び出すと思います。

これだけです!

関連する問題