почему замороженный столбец Jqgrid не работает со строками фильтра и заголовком фильтра? - PullRequest
2 голосов
/ 19 декабря 2011

Я не могу заставить замороженные столбцы работать с jqgrid (4.3.0). единственное, о чем я могу думать, это то, что у меня есть некоторые конкретные вещи, которые не входят в комплект поставки:

  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);
    

Кто-нибудь может придумать что-нибудь, что помешало бы в этих условиях работать замороженным столбцам.

1 Ответ

7 голосов
/ 24 декабря 2011

Я проанализировал вашу проблему и создал демонстрационную версию , которая демонстрирует, как можно решить проблему.Демонстрация создает сетку с замороженным первым столбцом:

enter image description here

Я нашел некоторые ошибки в текущей (версии 4.3.1) реализации замороженных столбцов в jqGrid и опубликую позже мойпредложения, как исправить там триранд.Проблемы следующие:

Первая проблема видна особенно отчетливо в случае datatype: 'local', когда данные сетки будут заполнены во время инициализации сетки.См. соответствующую демонстрацию , в которой я только что назвал метод setFrozenColumns.Проблема видна на рисунке

enter image description here

При этом видно, что только заголовок столбца будет заморожен, а тело сетки, включая столбец с номерами строк, будет прокручиваться.Как можно увидеть из следующей демонстрации , достаточно будет вызвать метод _complete сразу после вызова setFrozenColumns, чтобы решить проблему:

$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 не устранит проблему, и результаты все равно будут, как на демо :

enter image description here

Toисправить проблему Я написал очень простую функцию 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"];

В результате будет демонстрационная версия , на которую я ссылался в началемой ответ.Если вы введете какой-либо фильтр на панели инструментов фильтра поиска или в диалоговом окне расширенного поиска, заголовок сетки будет изменен (как в исходном примере), но все замороженные погружения будут иметь правильную позицию.

...