【问题标题】:Universal search field for jqgridjqgrid 的通用搜索字段
【发布时间】:2013-11-08 16:02:53
【问题描述】:

我是 jqgrid 的新手,我发现在 jqgrid 中实现搜索有四种方法:

a toolbar searching
a custom searching
a single field searching
a more complex approach involving many fields and conditions - advanced searching

我想知道是否可以实现一种“谷歌风格”的通用搜索,在这种情况下,您只有一个文本字段用于搜索查询。如果我要在该字段中写入一些内容,它会尝试从网格中的所有数据中进行搜索。

编辑:我想一次性获取所有数据并使用搜索该本地数据集。

见附图。

【问题讨论】:

  • 了解您使用的是哪个datatype 很重要。如果您使用datatype: "json"datatype: "xml" 而不使用loadonce: true,那么您可以访问服务器上的大型数据集,但您的服务器代码 必须实现搜索。 jqGrid 只是将搜索参数发送到服务器,服务器必须返回过滤后的数据。如果您使用其他 datatype 值(主要是 "local"),那么 jqGrid 可以为您搜索(过滤)数据。两种解决方案都可以实现,但实现方式完全不同。你需要哪一个?
  • 谢谢@Oleg!我想一次加载所有数据,然后在客户端(浏览器)端进行搜索。
  • 您是否尝试过我的回答中的建议?是你需要的吗?

标签: jquery search jqgrid


【解决方案1】:

是的,这是可能的——我可能会补充说非常简单。只需在网格上方(或您想要的任何位置)放置一个文本框:

<input type="text" id="search-string" name="search-string" />

还有一个搜索按钮:

<a href="#" id="search-button">Search</a>

这是该按钮的单击事件所需的 jQuery:

$("#search-button").button().click(function(){
    searchString = $.trim($("#search-string").val());

    // check to see a search term has been entered in the textbox
    if(searchString == ""){
        alert("Please enter a word or phrase before searching!");
        // reset search box value to empty
        $("#search-string").val("").focus();
    }
    else{
        // set your grid's URL parameter to your server-side select file (that queries the DB)
        // we pass one parameter - the search string from the textbox
        $("#your-grid").jqGrid('setGridParam',{url:'crud/full-text-search.php?searchString='+searchString});
        // This line may need to be changed (if you use XML instead of JSON) 
        // It will reload the grid, using the new URL with the search term parameter
        $("#your-grid").jqGrid('setGridParam',{datatype:'json'}).trigger('reloadGrid');  
    }
});

当然,在查询数据库的服务器端文件中,您需要获取包含搜索字符串的 URL 参数,并使用正确的 WHERE 子句构建查询...

【讨论】:

  • 感谢@FastTrack 的回答!如果我想对服务器进行另一个查询,这是一个很好的解决方案,谢谢。一旦我一次获取所有数据,我主要是在寻找一种进行本地搜索的解决方案。对不起,不够清楚。我已经更新了问题。
  • 嗯,好的,我明白了。不幸的是,我无法为搜索本地数据提供一个好的答案。我知道@Oleg 会 - 他是 jQGrid 高手!
  • 这个简单优雅。我刚刚使用 setGridParam 更改了 postData 及其工作!!
  • @HappyCoder 太棒了!祝你所有未来的 jQGrid 工作好运
【解决方案2】:

有很多方法可以实现这样的要求。我准备了两个演示,演示了一个可能的解决方案:the first onethe next one。第二个演示是第一个演示的增强版,我使用higlighting jQuery plugin,就像我描述它here一样。

首先,我将带有按钮的输入框添加到网格的顶部工具栏。我使用toolbar: [true, "top"] 在网格顶部添加一个空工具栏。然后我使用下面的代码

$('#t_' + $.jgrid.jqID($grid[0].id))
    .append($("<div><label for=\"globalSearchText\">Global search in grid for:&nbsp;" +
        "</label><input id=\"globalSearchText\" type=\"text\"></input>&nbsp;" +
        "<button id=\"globalSearch\" type=\"button\">Search</button></div>"));

用 HTML 片段填充工具栏

<div>
    <label for="globalSearchText">Global search in grid for:&nbsp;</label>
    <input id="globalSearchText" type="text">&nbsp;
    <button id="globalSearch" type="button">Search</button>
</div>

为了开始搜索,我使用了以下 JavaScript 代码

$("#globalSearchText").keypress(function (e) {
    var key = e.charCode || e.keyCode || 0;
    if (key === $.ui.keyCode.ENTER) { // 13
        $("#globalSearch").click();
    }
});
$("#globalSearch").button({
    icons: { primary: "ui-icon-search" },
    text: false
}).click(function () {
    var rules = [], i, cm, postData = $grid.jqGrid("getGridParam", "postData"),
        colModel = $grid.jqGrid("getGridParam", "colModel"),
        searchText = $("#globalSearchText").val(),
        l = colModel.length;
    for (i = 0; i < l; i++) {
        cm = colModel[i];
        if (cm.search !== false && (cm.stype === undefined || cm.stype === "text")) {
            rules.push({
                field: cm.name,
                op: "cn",
                data: searchText
            });
        }
    }
    postData.filters = JSON.stringify({
        groupOp: "OR",
        rules: rules
    });
    $grid.jqGrid("setGridParam", { search: true });
    $grid.trigger("reloadGrid", [{page: 1, current: true}]);
    return false;
});

$grid 是我们开始搜索的网格 (var $grid = $("#list");)。

为了提高顶部工具栏中元素的可见性,我使用了如此简单的附加 CSS

.ui-jqgrid .ui-userdata { height: auto; }
.ui-jqgrid .ui-userdata div { margin: .1em .5em .2em;}
.ui-jqgrid .ui-userdata div>* { vertical-align: middle; }

结果如下图所示

The second demo 使用高亮插件来提高网格的可见性,以便用户立即看到在行中找到搜索字段的位置:

可以看到,在创建搜索过滤器的过程中,我跳过了具有search: false 属性的列(如"note" 列)和具有stype: "select" 的列。我在所有列中都使用了"cn"(包含)过滤器。

【讨论】:

  • 优秀的答案!感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多