Я проанализировал вашу проблему и создал демонстрационную версию , которая демонстрирует, как можно решить проблему.Демонстрация создает сетку с замороженным первым столбцом:
Я нашел некоторые ошибки в текущей (версии 4.3.1) реализации замороженных столбцов в jqGrid и опубликую позже мойпредложения, как исправить там триранд.Проблемы следующие:
Первая проблема видна особенно отчетливо в случае datatype: 'local'
, когда данные сетки будут заполнены во время инициализации сетки.См. соответствующую демонстрацию , в которой я только что назвал метод setFrozenColumns
.Проблема видна на рисунке
При этом видно, что только заголовок столбца будет заморожен, а тело сетки, включая столбец с номерами строк, будет прокручиваться.Как можно увидеть из следующей демонстрации , достаточно будет вызвать метод _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
не устранит проблему, и результаты все равно будут, как на демо :
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"];
В результате будет демонстрационная версия , на которую я ссылался в началемой ответ.Если вы введете какой-либо фильтр на панели инструментов фильтра поиска или в диалоговом окне расширенного поиска, заголовок сетки будет изменен (как в исходном примере), но все замороженные погружения будут иметь правильную позицию.