JQGrid自定义sorting

我有一个JQGrid填充数据正常工作。 默认sortingfunction按预期工作。 不过,我想按点击列和按名称列sorting; 每次。 我认为onSortCol是我应该开始的地方,但是关于如何对表格内容进行sorting的文档并不多。 理想情况下,我想不必编写自己的sortingalgorithm,只需插入JQGrid API。 所有的数据都在客户端上,如果可能的话,我想尽量避免去服务器。

这里是我用来创build网格的代码:

 $jqGrid = $('#people_SelectedContacts').jqGrid({ ajaxGridOptions: { type: "POST" }, url: 'AJAX/GetContacts', datatype: "json", postData: JSON.stringify({ ID: $('#ID').val() }), loadonce: true, sortable: true, caption: "Selected Contacts", hidegrid: false, autowidth: true, rowNum: 10000, height: "100%", loadui: 'block', colNames: ['lecID', 'lrlID', 'mjID', 'Role', 'Name', 'Entity', 'Contact', 'D #', ''], colModel: [ { name: 'LECID', hidden: true }, { name: 'LRLID', hidden: true }, { name: 'MJID', hidden: true }, { name: 'RoleLookupName', index: 'RoleLookupName' }, { name: 'FullName', index: 'FullName' }, { name: 'Entity', index: 'Entity' }, { name: 'ContactInformation', index: 'ContactInformation' }, { name: 'DNumber', index: 'DNumber' }, { name: 'Remove', sortable: false, width: 25 } ], jsonReader: { root: 'ReturnValues.Contacts', repeatitems: false }, beforeProcessing: function (data, status, xhr) { if (!data.ReturnValues.Contacts) { data.ReturnValues.Contacts = new Array(); } $.each(data.ReturnValues.Contacts, function (index, value) { value.Entity = FormatAddress(value); value.ContactInformation = FormatContact(value); value.DNumber = FormatDocket(value); }); }, gridComplete: function () { var ids = $jqGrid.jqGrid('getDataIDs'); for (var i = 0; i < ids.length; i++) { removeButton = $('<span>').addClass('remove-contact jqui-button-fix'); $jqGrid.jqGrid('setRowData', ids[i], { Remove: $('<div>').append(removeButton).html() }); } }, loadComplete: function (data) { }, onSortCol: function (index, iCol, sortorder) { } }); 

在你的网格中,你有5个可见和可sorting的列:'RoleLookupName','FullName','Entity','ContactInformation','DNumber'。 从服务器加载网格数据后,数据types将从'json'更改为'local'对应于参数loadonce: true的行为。 从现在起,sorting将在当地进行。 因为您没有在任何列中定义sorttype属性,所以将使用默认的sorttype: 'text'

我如何理解“RoleLookupName”,“Entity”等列中的数据可以包含重复项,因此您希望通过主sorting列(例如“RoleLookupName”)和第二列(“ FullName“)。 在主sorting栏中出现重复的情况下,网格仍然按照第二栏的第二条标准进行sorting。 要实现这个行为,你应该使用自定义sorting。 你可以通过使用sorttype作为函数来实现它(请参阅答案 )。

sorttype作为函数的想法很容易。 sorttype应该返回应该使用的string或整数, 而不是主要的单元格包含。 例如,你可以像下面这样定义“RoleLookupName”

 { name: 'RoleLookupName', index: 'RoleLookupName', sorttype: function (cell, obj) { return cell + '_' + obj.FullName; }} 

包括演示的 另一个答案 ,你可能会发现也许有趣的理解。 它演示了更高级的技术,不仅实现了自定义sorting,还实现了自定义search。