2011-12-19 56 views
2

我無法獲得凍結列以使用jqgrid(4.3.0)。我能想到的唯一的事情是我有一些特定的東西不是開箱即用的:爲什麼Jqgrid凍結柱看起來不適用於過濾器行和過濾器標題?

  1. 我在頂部使用過濾行。
  2. 我使用(cloneToTop:true)顯示網格頂部的所有按鈕
  3. 我用下面的代碼來顯示jqggrid頂部的過濾器狀態。 (使用filtertoolbar)

    loadComplete: function() { 
    
        var postData = jQuery(gridSelector).getGridParam("postData"); 
        var newCapture = ""; 
        if (postData._search === true && typeof postData.filters !== "undefined") { 
         var filters = jQuery.parseJSON(postData.filters); 
         newCapture = "Filter: ["; 
         var rules = filters.rules; 
         for (var i = 0; i < rules.length; i++) { 
          var rule = rules[i]; 
          var op = rule.op; // the code name of the operation 
          if (jQuery.fn.searchFilter && jQuery.fn.searchFilter.defaults && 
          jQuery.fn.searchFilter.defaults.operators) { 
           // find op description 
           var operators = jQuery.fn.searchFilter.defaults.operators; 
           for (var j = 0; j < operators.length; j++) { 
            if (operators[j].op === rule.op) { 
             op = operators[j].text; 
             //op = $.jgrid.search.odata[j]; 
             break; 
            } 
           } 
          } 
          newCapture += rule.field + " " + op + " '" + rule.data + "'"; 
          if (i + 1 !== rules.length) 
           newCapture += ", "; 
         } 
         newCapture += "]"; 
        } 
        jQuery(gridSelector).setCaption(newCapture); 
    

任何人都可以想到的任何可能阻止在這些情況下工作的凍結列。

回答

7

我分析了你的問題,並創建了the demo,它演示瞭如何解決問題。該演示產生與凍結第一列格:

enter image description here

,我發現了一些錯誤,在jqGrid的當前(版本4.3.1)實現凍結列,後來將發佈我的建議如何解決那裏trirand。問題如下:

人們可以看到第一個問題特別清楚datatype: 'local'的情況下,網格的數據將在網格初始化期間填充。請參閱the corresponding demo,其中我剛剛調用方法setFrozenColumns。人們可以看到圖片上的問題

enter image description here

上可以看到,僅列標題將被凍結,但網格體包容與行號列將滾動。如何可以從the next demo看到它會調用的setFrozenColumns來解決這個問題後直接足以調用方法_complete

$grid.jqGrid('setFrozenColumns'); 
$grid[0].p._complete.call($grid[0]); 

其中$grid被定義爲var $grid = $('#list');

接下來的問題是,_complete方法計算列標題(保存在$grid[0].grid.fhDiv)和電網體(保存在$grid[0].grid.fbDiv)的固定部分的固定部分的位置僅使用標準網格的字幕的高度(網格標題)。因此,如果您使用setCaption更改標題,您可能會將「凍結」潛水置於錯誤的位置。 _complete方法setCaption後調用不會解決這個問題,人們仍然有結果像the demo

enter image description here

要解決這個問題,我寫了很簡單的功能fixPositionsOfFrozenDivs

var fixPositionsOfFrozenDivs = function() { 
     if (typeof this.grid.fbDiv !== "undefined") { 
      $(this.grid.fbDiv).css($(this.grid.bDiv).position()); 
     } 
     if (typeof this.grid.fhDiv !== "undefined") { 
      $(this.grid.fhDiv).css($(this.grid.hDiv).position()); 
     } 
    }; 

這修復冰凍潛水的位置。

最後我變化不大的loadComplete執行以下內容:

loadComplete: function() { 
    var $this = $(this), newCapture = "", filters, rules, rule, op, i, iOp, 
     postData = $this.jqGrid("getGridParam", "postData"), 
     isFiltering = $this.jqGrid("getGridParam", "search"); 

    if (isFiltering === true && typeof postData.filters !== "undefined") { 
     filters = $.parseJSON(postData.filters); 
     newCapture = "Filter: ["; 
     rules = filters.rules; 
     for (i = 0; i < rules.length; i++) { 
      rule = rules[i]; 
      op = rule.op; // the code name of the operation 
      iOp = $.inArray(op, arOps); 
      if (iOp >= 0 && typeof $.jgrid.search.odata[iOp] !== "undefined") { 
       op = $.jgrid.search.odata[iOp]; 
      } 
      newCapture += rule.field + " " + op + " '" + rule.data + "'"; 
      if (i + 1 !== rules.length) { 
       newCapture += ", "; 
      } 
     } 
     newCapture += "]"; 
    } 
    $this.jqGrid("setCaption", newCapture); 
    fixPositionsOfFrozenDivs.call(this); 
} 

其中陣列arOps被定義爲

var arOps = ["eq", "ne", "lt", "le", "gt", "ge", "bw", "bn", "in", "ni", "ew", "en", 
      "cn", "nc"]; 

作爲結果的一個將具有the demo我引用在我的回答開始時。如果您在搜索過濾器工具欄或高級搜索對話框中鍵入一些過濾器,網格的標題將會改變(就像在您的原始示例中那樣),但所有凍結的潛水將具有正確的位置。

+0

感謝您的回覆。 。你知道4.3.2版本是否會推出? – leora 2011-12-23 22:18:17

+0

@leora:這不取決於我。 :-)你應該在[三位論壇]上提問Tony(http://www.trirand.com/blog/?page_id=393/)。 – Oleg 2011-12-23 22:23:54

+0

@leora:你試過我的解決方案嗎?冰凍柱還有其他問題還是問題解決了? – Oleg 2011-12-27 14:01:21