jqGrid на Стороне клиента – запросы подкачки страниц/редактирования/сортировки

Я пытаюсь создать систему с помощью jqgrid, который делает все на стороне клиента, т.е. использует Ajax, чтобы получить объект JSON (использующий C#/.Net) и кэшировать это в переменной JavaScript и затем заполнить несколько сеток от того кэша (addRowData), в зависимости от данных. Это все работает очень хорошо.

Однако у меня есть проблемы при обнаружении, как сделать некоторые более усовершенствованные вещи теперь.

1) подкачка страниц/сортировка данные без взаимодействия сервера. Действительно ли это возможно? Или это требует, чтобы я записал пользовательские функции пейджинга (т.е. когда пользователь перемещается в страницу 2, получите следующие 10 записей от кэша и обновите сетку с ними). Надо надеяться, существует автоматический способ сделать это? Как насчет сортировки? Считайте некоторые вещи, которые предлагают его сделанную сторону сервера, но возможно они были старыми статьями?Не уверен.

2) Позвольте пользователям видеть средства управления (главным образом переключатели и datepicker) на каждой строке и отражать те изменения в переменной кэша. Я посмотрел на функции редактирования jqGrid, но это, кажется, "нажимают/редактируют/сохраняют". Идеально я хотел бы, чтобы начальный дисплей сетки показал, например, один из столбцов, отображающих пар переключателей на каждой строке и пользователе, может просто нажать тех, они интересуются (т.е. они не должны явно "редактировать" строку для видения/изменения переключателей). Эти данные обновляются в сетке и, что еще более важно, в переменной кэша управление сеткой. Существует ли автоматический способ связать средства управления на каждой строке к базовому клиентскому набору данных? Как я создаю средства управления в каждой ячейке и связываю их значение со значением ячейки?

Hoepfully кто-то мог указать на меня в правильном направлении?

Спасибо за любую справку можно дать,

Счет

5
задан skaffman 7 July 2010 в 16:59
поделиться

3 ответа

Все, что вы хотите получить в части 1 вашего вопроса, можно реализовать с помощью jqGrid 3.7.x. Вы должны использовать оба параметра datatype: 'json' и loadonce: true . Сервер должен отправить все данные обратно. См. В качестве примера jqgrid setGridParam datatype: local .

А как насчет второй части вашего вопроса. Мне кажется, вы пытаетесь сделать jqGrid слишком сложным. Мне гораздо проще установить некоторые элементы управления (поля выбора / раскрывающегося списка, флажки или переключатели) вне jqGrid (например, поверх сетки). Если пользователь вносит изменения в некоторые из этих элементов управления, вам следует перезагрузить сетку с сервера на основе новых выбранных параметров.См. Как фильтровать данные jqGrid, НЕ используя в качестве примера встроенное поле поиска / фильтра . Если вы попытаетесь объединить этот способ с параметром loadonce: true , вы должны понять, что после первой загрузки сетки с loadonce: true другой параметр datatype: ' json ' будет изменен на тип данных:' local '. Таким образом, чтобы перезагрузить сетку, вы должны дополнительно устанавливать тип данных: 'json' каждый раз перед перезагрузкой сетки.

ОБНОВЛЕНО на основе комментариев: Хорошо. Если у вас есть несколько предопределенных наборов данных, вы хотите загрузить все с сервера, а затем быстро отобразить необходимую сетку, вы можете просто определить несколько погружений и разместить все jqGrids (элементы div таблицы и подкачки) внутри соответствующего дополнительного div (один div на jqGrid) . Вы можете начать загрузку данных во все эти сетки при загрузке страницы. Вы делаете родительские div невидимыми или скрытыми относительно jQuery.show () и jQuery.hide () в любое время, когда вам нужно. Div, которые должны быть скрыты в начале страницы, могут иметь стиль CSS display: none .

Другой вариант динамического создания сеток с кэшированными данными представлен ниже. Вы можете удалить jqGrid с помощью jQuery.remove () и вставить новый

и элемент подкачки
с помощью такого метода, как jQuery.after () . Таким образом вы можете создавать jqGrid абсолютно динамично. Если вы это сделаете, вы должны принять во внимание, что jqGrid создает дополнительные div над элементами таблицы и подкачки.Итак, чтобы удалить весь jqGrid с id = "list", вы должны удалить div с id = "gbox_list". Альтернативно, если вы поместите и
, и пейджинг
в родительский элемент div и можете использовать jQuery.empty () и jQuery .html () в родительском div для удаления или вставки нового jqGrid.

Теперь об отображении радиокнопок внутри jqGrid. Это возможно, если вы будете использовать собственный форматировщик. См. jqGrid: Редактируемый столбец, в котором всегда отображается выбор в качестве примера того, как отображать выборки (раскрывающиеся списки) внутри jqGrid. Кстати, я не вижу преимуществ в использовании радиокнопок по сравнению с выборками. Радиокнопки заняли только больше места на странице, и пользователям придется чаще прокручивать страницу.

Тем не менее, я не рекомендую вам использовать сложные элементы внутри ячеек jqGrid. Я рекомендую вам продемонстрировать вашим пользователям возможность «встроенного редактирования» jqGrid. Это означает, что если пользователь выбирает строку или дважды щелкает по строке (вы можете реализовать один способ, который предпочитает своих пользователей), строка будет переключена в режим редактирования с помощью флажков, полей выбора (раскрывающихся списков), ввода текста и т. Д. . Это стандартный способ. Он имеет ряд преимуществ перед «редактированием форм» с точки зрения удобства пользователя. Чем больше вы отходите от стандартных способов, тем больше проблем вы можете получить в будущем. Чтобы продемонстрировать «встроенное редактирование», вы можете открыть http://trirand.com/blog/jqgrid/jqgrid.html и выбрать в дереве слева «Редактирование строк», а затем «Типы ввода».В качестве примера кода вы можете использовать jqGrid - редактировать только определенные строки для редактируемого столбца .

ОБНОВЛЕНИЕ 2 : Еще одно небольшое замечание.Если данные на сервере будут меняться нечасто и вы хотите, чтобы на клиенте было больше времени кеширования, вы можете использовать параметр prmNames: {nd: null} jqGrid, особенно если вы используете Internet Explorer. Если вы сделаете это, последние результаты HTTP GET (включая запросы jQuery.ajax ) будут кэшированы на клиенте, и следующие ajax rwquests смогут загружать данные из локального кеша браузера вместо отправки запросов на сервер. Если сервер включает в ответ какую-либо информацию о разрешенном времени кэширования (заголовки HTTP), он будет автоматически использован на клиенте в jQuery.ajax .

ОБНОВЛЕНО 3 на основе опубликованного исходного кода: В коде есть ошибки. Вот фиксированный код

var myGrid = $("#mygrid").jqGrid({
    datatype: 'local',
    colModel: [
        { name: 'AID', label: 'Some ID', key: true, width: 100,
          editable: false, sorttype: "int" },
        { name: 'Name', width: 300, editable: false },
        { name: 'Group', width: 100, editable: false },
        { name: 'Info', width: 100, editable: false },
        { name: 'AValue', width: 100, editable: true, edittype: 'text' }
    ],
    pager: '#mypager',
    rowNum: 10,
    rowList: [10, 20, 500],
    viewrecords: true,
    autowidth: true,
    sortname: 'AID',
    sortorder: 'desc'
});
myGrid.jqGrid('navGrid','#mypager',{edit:false,add:false,del:false,search:false});

var mydata = [];
for (var i = 0; i < 100; i++) {
   mydata.push({AID:i,Name:"123",Group:"456",Info:"78",AValue:"8"});
}
myGrid.setGridParam({data: mydata}).trigger("reloadGrid");

Вы можете попробовать его здесь http://www.ok-soft-gmbh.com/jqGrid/Clientside.htm

ОБНОВЛЕНО 4 : Тот же пример, включая клиента боковая правка находится здесь http://www.ok-soft-gmbh.com/jqGrid/ClientsideEditing.htm . Он основан на http://www.trirand.com/blog/?page_id=393/help/losing-edited-cell-data-after-paging/ и Потеря отредактированных данных ячеек. после пейджинга .

6
ответ дан 14 December 2019 в 08:40
поделиться

В последней версии jqGrid есть то, что вам нужно, я полагаю. По этой ссылке

  • Добавлена локальная пагинация, поиск, сортировка и виртуальная прокрутка. Пожалуйста, посмотрите демонстрацию Новое в 3.7
1
ответ дан 14 December 2019 в 08:40
поделиться

Мой код ниже. InitGridTestBulkLoad запускается после завершения загрузки грида и корректного отображения первой страницы из 10 записей. Элементы управления листанием показывают, что я нахожусь на странице 1 из 10.

Однако, если я нажимаю кнопку "Следующая страница", то появляется короткое окно "Загрузка", но ничего не меняется. Также, если я нажимаю заголовок первого столбца для сортировки, ничего не происходит.

Grid def и код для хранения "кэшированных" данных и загрузки их в грид:

jQuery(document).ready(function() {
    jQuery("#mygrid").jqGrid({
        dataType: "local",
        data: {},
        colNames: ['AID', 'Name', 'Group', 'Info', 'AValue'],
        colModel: [
                        { name: 'AID', label: 'Some ID', index: 'SomeID', width: 100, editable: false, sorttype: "int" },
                        { name: 'Name', label: 'Name', index: 'Name', width: 300, editable: false },
                        { name: 'Group', label: 'Group', index: 'Group', width: 100, editable: false },
                        { name: 'Info', label: 'Info', index: 'Info', width: 100, editable: false },
                        { name: 'AValue', label: 'AValue', index: 'AValue', width: 100, editable: true, edittype: 'text' }
                      ],
        pager: '#mypager',
        rowNum: 10,
        rowList: [10, 20, 500],
        viewrecords: true,
        loadonce: true,
        autowidth: true,
        sortname: 'AID',
        sortorder: 'desc'
    });

});

var oJR = {};
oJR.rows = new Array();
function InitGridTestBulkLoad() {
    oJR.total = 100;
    oJR.page = 1;
    oJR.records = 100;
    for (var i = 0; i < 100; i++) {
        var s = i.toString();
        oJR.rows[i] = {};
        oJR.rows[i].id = i;
        oJR.rows[i].cell = [s, "123", "456", "78", "8"];
    }

    var mg = $("#mygrid");
    mg[0].addJSONData(oJR);
}
0
ответ дан 14 December 2019 в 08:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: