2011-06-22 12 views
5

私は2000ノードを持つ私のasp.netアプリケーションでtreeviewを使用しています。 IE7,8でツリービューを読み込むのに40秒かかり、Firefoxとクロムで同じページが1/10時間かかる。この問題の解決策はありますか?これを検索しようとしましたが、未回答の質問しか見つかりませんでした。これがIE 7,8の制限である場合、その理由は何か。それはレンダリングエンジンのためですか?問題の解決策はありますか?私はjqueryツリービューを使用してみたが、IEと警告ポップアップを遅いスクリプトのために再度ハングすることを意味する。IE7,8でのASP.NETツリービューのパフォーマンスの問題

助けてください。

+0

ツリービューコントロールを表示できるので、設定したプロパティなどを確認できますか? – ChristiaanV

+0

これは通常のaspツリービューコントロールですが、唯一のことは、レンダリング時に実行されるjavascriptがたくさんあることです。 IE8では40秒間、FFでは4〜5秒かかります。 – Ankit

+0

ユーザビリティの観点からは、2000ノードのツリービューを含むページは無駄になります。 – IrishChieftain

答えて

0

アプリケーションでAJAXを使用し、AJAX経由でツリービューを動的にロードすることは常に有効です。ここでは、このjQueryプラグインを試してみました

http://www.codeproject.com/KB/ajax/selfloadelement.aspx

+0

試しましたが、スクリプトが応答しなくなりました。サポートするコードはありますか? – Ankit

3

リンクが...ですか? http://www.jstree.com/

これはAJAXロードをサポートしています。これは2000ノードツリーに最適です。

+0

私はajazツリーがほしくありません。私が探しているのは、ツリービュー全体を一度にレンダリングすることができるメカニズムです。性能はあります。 – Ankit

1

何か他のことが起こっている必要があります。私はTreeViewでいくつかのパフォーマンステストを行い、はるかに短い時間で40秒後に5000ノードを含む複雑なツリー構造をレンダリングすることができました。 IE8で約3秒でレンダリングされた2000ノードの複合ツリー。もしあなたがあなたのツリーについてもっと詳しい情報を提供できるのであれば、私はもっと助けてくれるかもしれません。

レンダリングされたHTMLの量は、大きなツリーの時間をレンダリングする際の最大の要因の1つです。ページ名を短縮してURL文字列の長さを短くする(ノードがページに直接リンクする場合)、CSSクラスをより高度なスタイルシートの使用方法に置き換えるなど、単純なことでさえかなり高速になります。

以下

_nodeCountサイズのランダムな複雑なツリーを生成するための私のコードです:

ASPXページはテレビという名前のTreeViewコントロールを持っています

<asp:TreeView ID="tv" runat="server"></asp:TreeView> 

コードの後ろに、次のようになります。

private Random _rand = new Random(); 
private int _nodeCount = 2000; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     //create a big tree 
     var itemCount = 0; 
     while (itemCount < _nodeCount) 
     { 
      //create a parent item 
      var n = new TreeNode("Node " + itemCount.ToString(), itemCount.ToString()); 
      itemCount++; 

      tv.Nodes.Add(n); 

      CreateSubItem(n, ref itemCount); 
     } 
    } 
} 

protected void CreateSubItem(TreeNode parent, ref int itemCount) 
{ 
    //chance that we won't create a sub item 
    if (_rand.Next(2) == 1 || itemCount > _nodeCount) 
    { 
     return; 
    } 

    var n = new TreeNode("Child Node " + itemCount.ToString(), itemCount.ToString()); 
    itemCount++; 

    parent.ChildNodes.Add(n); 

    CreateSubItem(n, ref itemCount); 
    CreateSubItem(parent, ref itemCount); 
} 

更新7/20
おそらくあなたはロジックをとることができますアイコンを設定して.NETコードに移動するためのjavascriptでは、これによりページの読み込み時間が大幅に短縮されます。このページ、http://weblogs.asp.net/dannychen/archive/2006/01/25/436454.aspxは、TreeNodeのレンダリングをカスタマイズする方法を示しています。多分それはあなたのための良い出発地になるかもしれません。

+0

私はviewstateをオフにしてページを軽量化しましたが、IE8にロードするのに50秒かかります。問題は、ノードのアイコンを変更する必要があり、これはページレンダリング後のjavascriptでのみ可能であることです。したがって、レンダリングはノードを反復し、ロジックに応じてツリービューノードのアイコンを変更します。関係するCSSはありません。ちょうどjsです。 – Ankit

+3

実際の問題は、Javascriptのパフォーマンスを向上させるか、アイコンを設定してパフォーマンスを向上させる別の方法が必要なことです。私は試して助けることができるようにJavaScriptコードを投稿できますか? – Peter

+0

@Ankit - カスタムTreeNodeレンダリングに関するリンクを含むように答えを更新しました。多分、あなたはJavaScriptを.Netコードに変換し、そのようにあなたのパフォーマンスを改善することができます。 – Peter

1

ツリービューから生成されたレンダリングされたhtmlを開くと、コントロールがhtmlテーブルtrとtdを生成することがわかります。これはIEでレンダリングするのに非常に時間がかかると思いますツリービューのコントロールから継承する新しいカスタムWebコントロールを作成し、HTMLの代わりにDivを書き込むための「レンダリングメソッド」を更新します。これには、プロフェッショナルな開発者とHTMLデザイナーが必要です。

私はあなたがこの新しいコントロールをコミュニティと共有することができると思います。このダミーのasp.net gridviewを取り除くために、あなたがそれを強化することができます。

+1

私のポストhttp://stackoverflow.com/questions/6435445/asp-net-treeview-performance-issue-with-ie7-8/6734147#6734147、本当の問題は彼がアイコンを設定するために使用している彼のカスタムJavaScriptです。私の答えは、はるかに大きく、IEでレンダリングするのに数秒しかかからないTreeViewを生成することを示しています。 – Peter

0

属性HoverNodeStyle-CssClass = "nh"を設定すると、IE9ではツリービューのレンダリングが遅くなります。私は属性を削除し、パフォーマンスを復元しました。