2010-07-10 76 views
3

我的HTML頁面上有2個網格。 當我單擊一個網格中的一行時,它需要根據所選行將數據加載到另一個網格中。(jqGrid)向服務器發送額外的自定義參數

所以我需要發送的ROWID作爲第二電網的額外參數..不能弄清楚如何..

(我寧可不喜歡用子網格功能)

回答

4

如果選擇「高級」,然後選擇「主細節」,則可以在http://trirand.com/blog/jqgrid/jqgrid.html上找到此方案的示例。我在代碼的一個小的變體下面包括。

讓我們在HTML頁面上有兩個網格:一個「主」網格和另一個「細節」網格,它需要根據選定到主網格中的行加載數據。讓我們這兩個網格必須填充從JSON格式發回數據的服務器的數據。我們假設,我們在主網格中使用單行選擇(沒有定義multiselect: true)。

下面是代碼模板

var detailsTitle = 'Details'; 
var grid = jQuery('#master').jqGrid({ // ... some parameters 
    url: masaterUrl, 
    datatype: 'json', 
    colModel: [ // ... some column definitions 
     { name: 'Name', width: 120 } 
    ], 
    onSelectRow: function(id) { 
     var selName = grid.getCell(id, 'Name'); 
     gridDetails.setCaption(detailsTitle + ' for "' + selName + '"'); 
     gridDetails.setGridParam({ 
      //url: urlGetDetail + '/' + encodeURIComponent(id), 
      //url: urlGetDetail + '?' + $.param({ userId: id }); 
      postData: { userId: id }, 
      page: 1, 
      datatype: 'json' }).trigger('reloadGrid'); 
    } 
}).navGrid('#pager', {}, {}, {}, { 
    afterSubmit: function(response, postdata) { 
     gridDetails.setCaption(detailsTitle); 
     gridDetails.setGridParam({ datatype: 'local', 
            page: 1 }).trigger('reloadGrid'); 
     return [true, '']; 
    } 
}); 

var gridDetails = jQuery('#detail').jqGrid({ // ... 
    caption: detailsTitle, 
    url: urlDetail, 
    //postData: { userId: function() { return grid.getGridParam('selrow'); } }, 
    datatype: 'local' 
}); 

現在一些對代碼的註釋。在開始時,主柵格中不會選擇行。因此,我們將datatype: 'local'設置爲拒絕和數據加載的細節網格參數。

如果將選擇主柵格中的一行,我們設置細節柵格的標題(標題),將細節柵格的datatype更改爲'json'並將page: 1設置爲page: 1。重置page參數很重要,因爲它將作爲附加參數發送到服務器。如果在最後一次選擇時用戶選擇了另一個頁面,並且對於新選擇,那麼沒有那麼多的datails行可以清空細節網格。要解決這個問題,我們應該始終將page設置爲1.

現在主要工作:發送主網格的id作爲服務器請求的詳細網格的參數。我們在這裏有一些選項:

  • 我們可以在'?userId='+id之後附加細節網格的網址。要更仔細地做到這一點,我們應該考慮到id可以有一些特殊字符。所以要確定我們應該使用'?userId='+encodeURIComponent(id)。功能jQuery.param以更具可讀性的形式進行。所以我們可以用'?'+jQuery.param({userId:id})代替。如果細節網格的url應該採用REST格式(如「blabla/id」),我建議使用這種方式。在這種情況下,將細節網格的url設置爲urlDetail+'/'+encodeURIComponent(id)可能是最好的方法。
  • 我們可以設置參數postData:{userId:id}。如果我們對服務器的請求使用HTTP GET,那麼跟'?'+jQuery.param({userId:id})一樣。這種方式的優點是我們也使用HTTP POST。然後,這些參數將被髮布到主體中,而不是附加到URL中。所以使用postData有一個小優點。
  • 我們可以從主網格的onSelectRow事件中刪除代碼,並在細節網格中包含作爲函數的附加參數postData(請參見注釋行)。除少數例外情況外,這種方式非常有效。例如,如果主網格中的選定行將被刪除,我們將很難清除詳細信息網格。在其他一些情況下,我們也缺乏靈活性。所以我只想提到這種可能性,但我只是將它作爲評論加入(如果您對此有興趣,請參見How to filter the jqGrid data NOT using the built in search/filter box)。
相關問題