TreeListCtrl のルート ノードに 1,000,000 以上のエントリを追加したいと考えています。したがって、「仮想」にしたいと思います。つまり、仮想 ListCtrl のように動作するようにして、現在表示されているアイテムがオンデマンドで読み込まれるため、高速で簡単にスクロールできるようにします。しかし、1,000,000 項目のいずれかを展開してその子を表示できるようにしたいので、仮想 ListCtrl を使用することはできません (項目の子は常に 50 未満です)。これは TreeListCtrl で効率的に行うことができますか? それとも違うクラスで?treemixin.VirtualTree と wx.gizmos.TreeListCtrl を使用した私自身の実験によると、OnGetItemText メソッドのオーバーロードは、単純な仮想 ListCtrl の場合と同じようには機能しません。ユーザーがスクロールしている間、オンデマンドで呼び出されるわけではありません。
3 に答える
私がやろうとしていることは、仮想 ListCtrl とデータ モデルのスキップ リストを使用することだと思います。最初に、データ モデルには 100 万の最上位ノードが含まれます。ノードが展開されると、その子をスキップ リストにログ時間で挿入できます (配列の線形時間よりもはるかに優れています)。親が誰であるかを視覚的にわかるように、ListCtrl 内の子の名前をインデントします。スキップリストのログ検索時間 (配列の即時ランダムアクセス時間とは対照的に) は、ユーザーのスクロールを処理するのに十分速いと思います。誰かがより良い提案を持っている場合は、私に知らせてください。私のアイデアがうまくいったかどうかについては、今後アップデートを提供します。
できることの 1 つは、サブノードを空のままにして、expand-node イベントをキャッチすることです。次に、ノードのサブノードが設定されているかどうかを確認します。そうでない場合は、ノードを展開する前に追加します。それらが設定されている場合は、単にイベントを無視します。
treemixin が TreeListCtrl を本当に仮想化しないのは、あなたの言うとおりです。私はtreemixinを開発していたときにそれについて考えましたが、解決方法がわからなかったのは、ユーザーがツリーの奥深くにあるアイテムを見ているときに、アイテムの左側にどの線を引くかを知る方法でした.10000から10030. その解決方法をご存知でしたら、treemixin を喜んで適応させていただきます。
フランク
作成者 treemixin