2012-02-13 20 views
0

こんにちは私はjqgridを使って.net MVC 3.0 C#アプリケーションのデータを読み込みます。jqgridツールバーの検索または外部検索機能

約6つの異なる場所にロードする必要があるマテリアルグリッドがあります。彼らはすべて同じです。グリッドには約8700アイテムの価格と詳細が掲載されています。

問題は、「コスト」と「価格」の2つの列にデータベースから実行される計算があることです。これらの2つの列は、グリッドの負荷を極端に遅くします。

私たちが作業していた材料テストリストには、最初に約730個のアイテムがありました。いくつかの種類の最適化がない最初の場合、グリッドは完全にロードするのに約1分30秒かかります。変更後、これは許容可能な約4秒に低下した。

これで、材料に使用される実際のリストが作成されました。このリストには8500以上のアイテムが含まれています。最初のロードの後、それは8500アイテムをロードする時計で約2分を話している。

これは実際には受け入れられないので、検索ツールバー機能や外部検索はアイテムを読み込む検索結果アイテムのみにすることをお勧めします。

私が見たいのは、最初のページが読み込まれた後、グリッドが空であり、検索が完了して検索結果のみが表示されることです。

可能であれば、検索ツールバーの機能でこれを行うことができます。これは既に正常に動作していますが、長い初期の負荷の後です。

非常に歓迎される提案です。私は元のプログラマーではないので、できるだけGoogle検索のために私のdevを支払う必要はありませんいくつかの情報を取得しようとしています。現在のコードの例が必要な場合

Serer側のコード、私は必要なものが可能であるならば、あなたはいくつかのサンプルコードを提供することができれば、私はそれが役立つかどうかを知るか、聞かせてください、お時間をいただき、ありがとうございます:

public ActionResult EstimateMaterialAddGridData(string sidx, string sord, int page, int rows) 
    { 

     IQueryable<Material> mats; 
     mats = Material.Find(x => x.OwnerId == UserAccount.GetOwnerId && x.isDeletedFromCatalog == false).AsQueryable(); 

     int pageIndex = page - 1; 
     int pageSize = rows; 
     int totalRecords = mats.Count(); 
     int totalPages = (int)Math.Ceiling((float)totalRecords/(float)pageSize); 
     var jsonData = new 
     { 
      total = totalPages, 
      page = page, 
      records = totalRecords, 
      rows = (
       from sub in mats 
       select new 
       { 
        i = sub.Id, 
        cell = new string[] { 
         sub.Id.ToString(), 
         sub.Id.ToString(), 
         sub.Id.ToString(), 
         sub.ProductCode, 
         sub.Description, 
         sub.Units, 
         sub.Categories, 
         sub.UnitCost.ToString(), 
         sub.Price.ToString() 
        } 
       } 
      ).ToArray() 
     }; 

     return Json(jsonData); 
    } 

JSグリッドcode`jQuery(ドキュメント).ready(関数(){ VARグリッド

= jQueryの( "#1 MGRID");

grid.jqGrid({ 
    url: '/Material/EstimateMaterialAddGridData', 
    datatype: 'json', 
    mtype: 'POST', 
    colNames: ['Id', '','View/Edit', 'Product Code', 'Description', 'Units', 'Categories', 'Cost', 'Price'], 
    colModel: [ 
     { name: 'Id', index: 'Id', key: true, hidden: true, editrules: { edithidden: true} }, 
     { name: 'Add', index: 'Add', sortable: false, width: 50,search:false, resizable: false, editable: false, align: 'center', formatter: formatLink, classes: 'not-editable-cell' }, 
     { name: 'Open', index: 'Open', sortable: false, width: 90,search:false, resizable: false, editable: false, align: 'center', formatter: formatLinkNew, classes: 'not-editable-cell' }, 
     { name: 'ProductCode', index: 'ProductCode', sorttype: 'text',search:true, width: 100, resizable: false }, 
     { name: 'Description', index: 'Description', sorttype: 'text',search:true, width: 275, resizable: false }, 
     { name: 'Units', index: 'Units', sorttype: 'text', width: 75,search:true, resizable: false }, 
     { name: 'Categories', index: 'Categories', sorttype: 'text',search:true, width: 300, resizable: false, editable: false, }, 
     { name: 'UnitCost', index: 'UnitCost', sorttype: 'float', width: 75,search:true, align: 'right', resizable: false, editable: false, formatter: 'currency' }, 
     { name: 'Price', index: 'Price', sorttype: 'float', width: 75, search:true,align: 'right', resizable: false, editable: false, formatter: 'currency' }, 
    ], 
    pager: '#mpager', 
    height: '100%', 
    rowNum: 10, 
    rowList: [10, 20, 50, 100], 
    sortname: 'Id', 
    sortorder: 'desc', 
    sortable: true, 
    loadonce: true, 
    ignoreCase: true, 
    viewrecords: true, 
    caption: 'Material', 
    cellEdit: false, 
    hidegrid: false, 
    viewrecords: true, 

}); 

grid.jqGrid('navGrid', '#mpager', 
    { resize: false, add: false, del: false, search: true, refresh: true, edit: false, alerttext: 'Please select an material' } 
).jqGrid('navButtonAdd', '#mpager', 
    { title: "Create New Material Catalouge", buttonicon: "ui-icon-plus", onClickButton: newMaterial, position: "First", caption: "" });` 
+0

現在、jqGridを使用するコードを含めることができますか?列 "コスト"と "価格"の実装に関する詳細情報を含めることができますか。なぜ列に問題があるのか​​理解できません。列の値を生成するSELECTが遅すぎますか? – Oleg

答えて

1

Iを転送することができますあなたは以下の2つの古い回答に答えます:thisthis。回答には、jqGridで検索ツールバーを使用する方法を示すデモプロジェクトが含まれています。

私は劇的にあなたが常にjqGridのgridview: trueオプションを使用する必要がありますjqGrid

  • のパフォーマンスを向上させることができ、次のことを言及する必要があります。私の意見では、jqGridのデフォルトオプションにする必要があります。
  • サーバーサイドページングを確実に使用する必要があります。ユーザー8500+(または730)のアイテムを一度に表示する意味はありません。モニタはアイテムを表示することができず、ユーザは非常に多くのアイテムからの情報を同化することはできません。ユーザーが本当に必要とするのは、データのインテリジェントなフィルタリングが可能なことです。私は、より複雑な検索フィルタを構築する上級ユーザーを助けるsearching toolbaradvanced searchingのグリッドのフィルタリングからのほとんどの組み合わせを使用します。さらに、あらかじめ定義された名前付きフィルタテンプレートによく使用されるフィルタをいくつか保存することも検討できます。フィルタテンプレートの例は、「検索」/「検索テンプレート」のthe official demo pageにあります。別の方法は、外部フィルタを使用することです。 the answerでは、途中であなたを助けることができる実装の詳細が見つかります。
  • 最初にグリッドを読み込まないようにするには、最初にサーバに要求をスキップするdatatype: 'local'を使用できます。サーバとの通信を有効にするには、必要に応じて、datatype'json'または'xml'に変更することができます。たとえば、$(this).jqGrid('setGridParam', {datatype: 'json'});loadCompleteのすぐ内側に配置することができます。
+0

これは機能するかどうかを確認します。私のグリッドは1ページあたり20の結果しか表示されないように設定されています。このように設定されているにもかかわらず、8500以上のアイテムはすべてバックグラウンドでロードされるので、2、3、4ページに行くと、それらはすべて既にロードされています。検索語を入力するときに1ページあたり20を読み込むだけに変更すると、読み込まれた20のアイテムだけが表示されますか、それとも8300アイテムすべてがまだ見えますか? – GTITC

+0

@ user1206514:ページングやソートのような検索はサーバー側で実装する必要があります*。サーバは現在のフィルタを 'filters'パラメータとして取得します。データベースへの 'SELECT'の' WHERE'部分を構築し、要求されたページの前のようにクライアントに返すべきです。要求されたページは 'page'と' rows'パラメータによって識別されます。このシナリオに従うと、前のクエリの結果(別のページを取得するため)、完全なSELECT(ページングなし)のデータをデータベースにキャッシュすることができます。したがって、別のページの選択は一般的に迅速です。 – Oleg

+0

@ user1206514:サーバー側のページング、ソート、*フィルタリング*を使用し、すべての部分を慎重に実装した場合、10000項目のようなデータの読み込み時間は、どのような方法でもページあたり1秒以下です。 SQLパラメータを使用してクエリのWHERE部分を構築すると、SQLインジェクション攻撃がなくなります。だから、あなたは本当に素早く安全なだけでなく、安全に働くすべてを実装することができます。 – Oleg