【问题标题】:How to filter the jqGrid data NOT using the built in search/filter box如何不使用内置的搜索/过滤框过滤 jqGrid 数据
【发布时间】:2011-02-25 01:58:20
【问题描述】:

我希望用户能够在不使用内部搜索框的情况下过滤网格数据。

我为日期(从和到)创建了两个输入字段,现在需要告诉网格将其用作过滤器,然后请求新数据。

伪造对网格数据的服务器请求(绕过网格)并将网格的数据设置为响应数据将不起作用 - 因为一旦用户尝试重新排序结果或更改页面等,网格就会使用空白过滤器从服务器请求新数据。

我似乎找不到网格 API 来实现这一点 - 有人有什么想法吗?谢谢。

【问题讨论】:

标签: jquery search filter jqgrid


【解决方案1】:

关于postData参数包括函数和trigger('reloadGrid'),你的问题可以很容易地解决。我试着更详细地解释这个想法。

让我们使用mtype: "GET"。标准搜索/过滤框在显示界面后唯一要做的就是将一些附加参数附加到 url,发送到服务器并重新加载网格数据。如果您有自己的搜索/过滤界面(例如,一些选择控件或复选框),您应该自己附加您的 url 并根据trigger('reloadGrid') 重新加载网格。要重置网格中的信息,您可以选择任何您喜欢的方式。例如,您可以在选择控件中包含“不过滤”之类的选项。

更准确地说,您的代码应该类似于答案 how to reload jqgrid in asp.net mvc when i change dropdownlist 中的代码:

var myGrid = jQuery("#list").jqGrid({
    url: gridDataUrl,
    postData: {
        StateId: function() { return jQuery("#StateId option:selected").val(); },
        CityId: function() { return jQuery("#CityId option:selected").val(); },
        hospname: function() { return jQuery("#HospitalName").val(); }
    }
    // ...
});
//
var myReload = function() {
    myGrid.trigger('reloadGrid');
};
var keyupHandler = function (e,refreshFunction,obj) {
    var keyCode = e.keyCode || e.which;
    if (keyCode === 33 /*page up*/|| keyCode === 34 /*page down*/||
        keyCode === 35 /*end*/|| keyCode === 36 /*home*/||
        keyCode === 38 /*up arrow*/|| keyCode === 40 /*down arrow*/) {

        if (typeof refreshFunction === "function") {
            refreshFunction(obj);
       }
    }
};

// ...
$("#StateId").change(myReload).keyup(function (e) {
    keyupHandler(e,myReload,this);
});
$("#CityId").change(myReload).keyup(function (e) {
    keyupHandler(e,myReload,this);
});

如果用户在id=StateId 或另一个带有id=CityId(鼠标或键盘)的选择框中更改选择的选项,函数myReload 将被调用,它只是强制重新加载jqGrid 中的数据。在 jqGrid 为我们执行相应的$.ajax 请求期间,来自postData 参数的值将作为data 参数转发给$.ajax。如果data 的一些属性是函数,这些函数将被$.ajax 调用。因此,将加载来自选择框的实际数据,并将所有数据附加到发送到服务器的数据中。您只需要在您的服务器部分实现读取此参数。

因此来自postData 参数的数据将附加到url(符号'?' 和'&' 将自动添加,并且所有特殊符号(如空格)也将照常编码)。使用postData的好处是:

  1. postData 参数中的函数用法允许您从所有使用过的控件加载实际值到重新加载的时刻;
  2. 您的代码保持结构非常清晰。
  3. 不仅适用于 HTTP GET 请求,也适用于 HTTP POST;

如果您在选择框StateId 中使用一些“无过滤”或“全部”条目,您可以修改计算StateId 参数值的函数,该参数应附加到服务器url

StateId: function() { return jQuery("#StateId option:selected").val(); }

类似于以下内容:

StateId: function() {
    var val = jQuery("#StateId option:selected").val();
    return val === "all"? "": val;
}

在服务器端,如果您收到一个空值作为参数,则不应过滤 StateId

您可以选择使用myGrid.setCaption('A text'); 更改网格标题。这让用户可以更清楚地看到,网格中的数据是用一些标准过滤的。

【讨论】:

  • @Oleg,我可以用grid.setGridParam 覆盖默认的postData 函数吗?我正在尝试这样做,但没有成功。看来即使我通过grid.setGridParam 设置了一个参数,它仍然会得到我之前定义的默认postData 函数。
  • @AdrianoRR:也许你应该写一个新问题来描述你想要解决的问题。你需要什么?您是否希望某些参数不会发送到服务器?您是否需要对现有参数进行自定义格式(例如转换为 JSON)?或者您可能不想向服务器发送任何其他参数?
  • @Oleg,通过查看您的其他一些帖子,我设法得到了自己的答案。通过使用grid.getGridParam,我可以获得 postData 属性并将它们设置为我想要的任何值。然后我所要做的就是致电grid.trigger("reloadGrid"); 并完成更改。不管怎样,谢谢你的 S.O.帖子!
  • @AdrianoRR:不客气!对不起,但我还是不明白你想做什么。您要发布附加自定义参数还是以某种方式更改现有标准参数?我建议你提出新问题,以便给你更多的地方来详细描述你的问题,并解释你需要实现什么,你需要向服务器发送什么信息等等。
  • @abhihello123:不客气! $("#list").jqGrid.trigger('reloadGrid') 的用法绝对是错误的。表达式$("#list").trigger('reloadGrid') 是正确的。 trigger 方法是常见的 jQuery 方法,您可以将其应用于任何 jQuery 对象。 $("#list")myGrid 是 jQuery 对象,因此您可以在对象上使用 trigger 方法。表达式$("#list").jqGrid 是应用于$("#list") 对象的方法。您可以使用$("#list").jqGrid({...})$("#list").jqGrid("jqGridMethid", ...),但不能使用$("#list").jqGrid.trigger(...)
【解决方案2】:

我有同样的要求,并且(在 Oleg 的帮助下)想出了这个:

基本上,用户开始在“员工姓名”文本框中输入内容,结果立即显示在 jqGrid 中。

我如何实现的细节在这里:

jqGrid - Change filter/search pop up form - to be flat on page - not a dialog

请注意,我专门为我的 jqGrid 提前加载了 所有 JSON 数据,并且对于大型数据集,在运行此代码时会有延迟键入每个字符时的 iPhone/Android 设备。

但是,对于桌面网络应用程序来说,这是一个很好的解决方案,并且让 jqGrid 对用户更加友好。

【讨论】:

    【解决方案3】:

    通过使用ReloadGrid()jquery 函数,您可以制作自己的自定义过滤函数。

    【讨论】:

      猜你喜欢
      • 2010-12-27
      • 2011-08-14
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      • 2019-06-14
      相关资源
      最近更新 更多