因此,在当前的应用程序,我必须使用自定义格式在我的jqGrid几排。 所有这些做的只是几个字段从我的Ajax调用,CONCAT它们合为一体,并把该成一排。
EG(data.toStreet + data.toCity + data.toState + data.toZip)回来为“街道城市,州邮编”到“应对”一栏。 这工作正常和数据正确地显示,但使用过滤工具栏的情况下,滤波器仅基于第一VAL(data.street)。 下面是代码有问题的作品的超级简化版本。
$('#grid').jqGrid({
...
colNames:["AddressTo", "AddressFrom"],
colModel:[
{name:"toStreet" formatter: ToAddressFormatter},
{name:"fromStreet" formatter: FromAddressFormatter}
],
...
}),
$('#grid').jqGrid('filterToolbar',
{
stringResult:true,
searchOnenter: true,
defaultSearch: 'cn'
}
});
ToAddressFormatter = function(el, opt, rowObj){
var address = rowObj.toStreet+ " " + rowObj.toCity + ", " + rowObj.toState + " " + rowObj.toZip;
return address;
},
FromAddressFormatter = function(el, opt, rowObj){
var address = rowObj.fromStreet+ " " + rowObj.fromCity + ", " + rowObj.fromState + " " + rowObj.fromZip;
return address;
}
因此,如果在CEL值格式化后说:“123假ST,斯普林菲尔德,弗吉尼亚州22344”,过滤器工具栏只能搜索“123假ST”,别无其他。 有谁知道如何解决这个问题的任何线索,或者可能使用它的原因和解决方法好?
编辑:我已经包括了我网格的开始。 此外,result.d的财产地址在下面的代码中创建的,而不是从WebService返回。 我列映射到“地址”,它可以正确显示的格式,但作为预期仍然没有搜索。
$('#grdDisasters').jqGrid({
datatype: function(postdata) {
var obj = { "showActive": $('#btnFilterActive.pressed').length > 0 ? true : false, "showInactive": $('#btnFilterActive.pressed').length > 0 ? true : false,
'page': postdata.page, 'rows': postdata.rows, 'sortIndex': postdata.sidx, 'sortDirection': postdata.sord, 'search': postdata._search,
'filters': postdata.filters || ''
};
$.ajax({
url: "/GetGrid",
data: JSON.stringify(obj),
success: function(result) {
for (var i = 0, il = result.d.rows.length; i < il; i++) {
LoadedDisasters[i] = result.d.rows[i];
result.d.rows[i].cells.Address = result.d.rows[i].cells.Street + " " + result.d.rows[i].cells.City + ", "+ result.d.rows[i].cells.State+ " "+ result.d.rows[i].cells.Zip;
}
result.d = NET.format(result.d);//just correctly format dates
UpdateJQGridData($('#grdDisasters'), result.d);
},
error: function(result) {
//alert("Test failed");
}
});
的jqGrid具有当数据使用自定义/预定义的格式格式化的滤波的行的问题。
你将不得不在服务器端过滤行。
添加2个请求参数在你的控制器来处理jqGrid的搜索请求:
当过滤原糖jqGrid的请求,它会增加一个参数: _search
与价值: true
和喜欢的所有搜索参数col1=abc&col4=123
意味着用户要进行筛选使用指定的列col1
和列命名col4
与值分别为: abc
和123
使用这些值和查询与操作一样东西数据库,如下所示:
select id, concat(street1, street2, city, state, zip) as address
where address like "%abc%" and id like "%123%"
返回这些行作为JSON的jqGrid到并显示那些在当前页面。 所以基本上你就必须有一个与服务器端分页一个jqGrid的,排序和搜索。 你不能使用客户端分页,排序和搜索功能。 此外,还要确保你没有loadonce: true
集。
我认为,你填在错误的道路网格。 如果您的源数据toStreet,toCity,使用toState,toZip,fromStreet,fromCity,fromState,fromZip性能,你需要有由addressTo
和addressFrom
您应该以另一种方式做到这一点。 你的问题是, toStreet
和fromStreet
将在本地内部保存的data
参数,在原来的格式 , 与您从服务器得到它。 本地搜索使用的data
参数,所以toStreet
和fromStreet
像你到达那里从服务器将被使用。
你不贴你使用的jqGrid的更完整的代码。 所以我想,你使用datatype: 'json'
, datatype: 'jsonp'
或datatype: 'xml'
结合loadonce: true
。 你应该定义colModel
$('#grid').jqGrid({
...
colNames:["AddressTo", "AddressFrom"],
colModel:[
{name: "addressTo", ...},
{name: "addressFrom", ...}
],
beforeProcessing: function (data) {
var i, rows = data.rows, l = rows.length, item;
for (i = 0; i < l; i++) {
item = rows[i];
item.addressTo = item.toStreet + " " + item.toCity + ", " +
item.toState + " " + item.toZip;
item.addressFrom = item.fromStreet+ " " + item.fromCity + ", " +
item.fromState + " " + item.fromZip;
}
}
...
});
确切的代码依赖于输入数据的格式。 的使用的优点beforeProcessing
是前的数据将被的jqGrid处理它会被调用。 所以,你可以做数据或如上面的任何修改。
更新 :的代码datatype
可以以另一种方式使用标准的jqGrid选项很容易实现。 因此,我建议使用如下设置:
datatype: "json",
url: "/GetGrid",
postData: {
// add and to the list of parameters sent to the web service
showActive: function () {
return $('#btnFilterActive.pressed').length > 0;
},
showInactive: function () {
return $('#btnFilterActive.pressed').length > 0;
}
},
prmNames: {
// rename some parameters sent to the web service
sort: "sortIndex",
order: "sortDirection",
search: "search",
// don't send nd parameter to the server
nd: null
// you leave the nd is you don't set any "Cache-Control" HTTP header
// I would recommend you to set "Cache-Control: private, max-age=0"
// For example
// HttpContext.Current.Response.Cache.SetMaxAge (new TimeSpan(0));
},
serializeGridData: function (postData) {
// control modification of the the data (parameters) which will be sent
// to the web method
if (typeof postData.filters === "undefined") {
postData.filters = "";
}
return JSON.stringify(postData);
},
ajaxGridOptions: { contentType: "application/json" },
jsonReader: {
root: "d.rows",
page: function (obj) { return obj.d.page; },
total: function (obj) { return obj.d.total; },
records: function (obj) { return obj.d.rows.length; },
repeatitems: false
},
loadError: function (jqXHR, textStatus, errorThrown) {
// see an implementation example in the answers
// https://stackoverflow.com/a/6969114/315935
// and
// https://stackoverflow.com/a/5501644/315935
},
colNames:["AddressTo", "AddressFrom"],
colModel:[
{name: "addressTo", ...},
{name: "addressFrom", ...}
],
beforeProcessing: function (data) {
var i, rows, l, item;
data.d = NET.format(data.d); // just correctly format dates
rows = data.d.rows;
l = rows.length;
for (i = 0; i < l; i++) {
item = rows[i];
LoadedDisasters[i] = item;
item.addressTo = item.toStreet + " " + item.toCity + ", " +
item.toState + " " + item.toZip;
item.addressFrom = item.fromStreet+ " " + item.fromCity + ", " +
item.fromState + " " + item.fromZip;
}
}
...
的使用nd: null
与设置“缓存控制:私人,最大年龄= 0”我所描述的答案 。 您可以下载它使用相应的演示项目。 在一般的需求只包括在您调用一个附加行SetMaxAge
[WebMethod]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public MyGridData GetGrid(...) {
HttpContext.Current.Response.Cache.SetMaxAge (new TimeSpan(0));
...
}
查看更多有关缓存可以阅读控制这里 。
文章来源: JQGrid Filter Toolbar not filtering rows when using a Formatter on a column