2012-02-24 4 views
0

にコピーするシナリオ:DevExpress.XtraTreeList.TreeList全体をC#

データベースを使用してTreelistを作成して設定しています。

これはかなり時間がかかる作業であり、guiをハングアップさせたくない(「プログレスバー」などはありません)。

私はこれをBackgroundworkerに移すことにしましたが、別のスレッドからツリーを更新してから作成したツリーをバックグラウンドスレッドで作成しています。全体の内容をGUIで表示されたツリーに表示します。

  1. すべてのノード、ノードデータなどをトラバースしてコピーする最良の方法は何ですか?
  2. これを行うもう1つの方法がありますか?つまり、Backgroundworkerでツリーを作成/作成し、GUIに表示しますか?

編集:私は、バックグラウンドスレッドでGUIコンポーネントを配置する 'ハック'を認識していますが、このプロジェクトに投げ込まれて、「GUIが非常に頻繁に停止しないようにする」非常に限定された時間枠で、データのロードと作成を再作成することは実際にはオプションではありません(これがベストプラクティスであるにもかかわらず)。 "CreateTree"ファンクションを新しいスレッドで実行するように変更し、新しく作成したツリーを "ThreadComplete"に渡してコピーしました。

いいえ、おしゃべり

答えて

1

UI要素は、UIの終わりに物事を残す必要があります。これには技術的な理由があります.Windowsでは、メインのUIスレッド以外のスレッドからUI要素を更新することはできませんが、アーキテクチャー上の理由からバックエンドのDBアクセスコードを特定のUI実装と密接に関連付けるべきではありません。 DevExpressや他のベンダーがTreeListから別のコントロールに切り替えることに決めた場合は、システム全体を通してコードを置き換える必要があります。あなたが何をしたいか

はバックエンドのコードを持っている。このように、階層構造を持つビジネス・オブジェクトのリストのように、より一般的なデータ構造を作成します。

public class MyBusinessObject 
{ 
    public string Name {get;set;} 
    public List<MyBusinessObject> ChildObjects {get;} 
} 

MyBusinessObjectのリストを返しますあなたのバックグラウンドスレッドから。このリストは、データバインディングを使用してTreeListに接続する必要があります。あなたはあなたが使用しているUIプラットフォームを指定していませんでした.XtraaTreeListはWinFormsコントロールですよね?すべての共通フレームワークには、すべての作業を自分で行うのではなく、このビジネスオブジェクトのリストをUIコントロールにバインドするデータバインドオプションがあります。

0

他のスレッドからコンポーネントを更新するには、SynchronizationContextを使用して、それを同じスレッドのようにトラバースすることができます。

関連する問題