首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >jqgrid:如何在组合框中定义过滤器预设/模板?

jqgrid:如何在组合框中定义过滤器预设/模板?
EN

Stack Overflow用户
提问于 2012-02-16 09:27:27
回答 1查看 5.2K关注 0票数 2

我有一个包含一些要过滤的数据的jqgrid。我想定义一个带有一些预定义的过滤器集/模板的组合框。如果用户选择组合框的一项,网格将自动应用组合筛选器。最好将组合框集成到工具栏或jqGrid的分页中,也可以集成到html页面中。

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
         COMBO BOX
       Item templates       filter parameters
        ___________
       |Expired    |        << Timeout = true
       |Last Week  |        << OpenDate between 02/13/2012 and 02/16/2012
       |Last Month |        << OpenDate between 01/01/2012 and 02/16/2012
       |.........  |        ......

提前感谢您的帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-16 11:48:54

jqGrid在Advance Searching中支持Searching Templates (请参阅the official jqGrid demo中的“搜索”/“搜索模板”),但目前Toolbar Filtering中不支持搜索模板。

我觉得你的问题很有趣。在the old question中,我描述了如何使用通用外部过滤器向服务器发送附加信息。这种方法适用于远程数据,但不能直接在本地网格或带有loadonce: true选项的网格中使用。

因此,我创建了the demo,它展示了如何在Toolbar Filtering中实现过滤器模板,以及如何将模板集成到jqGrid中。我使用toolbar: [true, "top"]在列标题上方添加了额外的空白工具栏:

在实现中,我使用了我最初建议的hererefreshSerchingToolbar函数。重要的是要理解,refreshSerchingToolbar函数只填充过滤器工具栏中可以由过滤器准确表示的信息。例如,“已关闭”行的筛选器可以在筛选器工具栏中显示(参见上图),但“上周”和“上个月”的日期间隔不能。在这种情况下,网格中的数据将被筛选,但筛选器工具栏的相应字段保持为空。

您可以在下面找到演示代码中最重要的部分

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var $grid = $("#list"),
    initDate = function (elem) {
        $(elem).datepicker({
            dateFormat: 'dd-M-yy',
            autoSize: true,
            changeYear: true,
            changeMonth: true,
            showButtonPanel: true,
            showWeek: true
        });
    },
    numberTemplate = {formatter: 'number', align: 'right', sorttype: 'number', editable: true/*,
        searchoptions: { sopt: ['eq', 'ne', 'lt', 'le', 'gt', 'ge', 'nu', 'nn', 'in', 'ni'] }*/},
    dateTemplate = {width: 80, align: 'center', sorttype: 'date',
            formatter: 'date', formatoptions: { newformat: 'd-M-Y' }, editable: true, datefmt: 'd-M-Y',
            editoptions: { dataInit: initDate },
            searchoptions: { sopt: ['eq', 'ne', 'lt', 'le', 'gt', 'ge'], dataInit: initDate }},
    yesNoTemplate = {align: 'center', editable: true, formatter: 'checkbox',
            edittype: 'checkbox', editoptions: {value: 'Yes:No', defaultValue: 'No'},
            stype: 'select', searchoptions: { sopt: ['eq', 'ne'], value: ':Any;true:Yes;false:No' }},
    myDefaultSearch = 'cn',
    getColumnIndex = function (columnIndex) {
        var cm = this.jqGrid('getGridParam', 'colModel'), i, l = cm.length;
        for (i = 0; i < l; i++) {
            if ((cm[i].index || cm[i].name) === columnIndex) {
                return i; // return the colModel index
            }
        }
        return -1;
    },
    refreshSerchingToolbar = function (myDefaultSearch) {
        var filters, i, l, rules, rule, iCol, cmi, control, tagName,
            $this = $(this),
            postData = $this.jqGrid('getGridParam', 'postData'),
            cm = $this.jqGrid('getGridParam', 'colModel');

        for (i = 0, l = cm.length; i < l; i++) {
            control = $("#gs_" + $.jgrid.jqID(cm[i].name));
            if (control.length > 0) {
                tagName = control[0].tagName.toUpperCase();
                if (tagName === "SELECT") { // && cmi.stype === "select"
                    control.find("option[value='']")
                        .attr('selected', 'selected');
                } else if (tagName === "INPUT") {
                    control.val('');
                }
            }
        }

        if (typeof (postData.filters) === "string" &&
                typeof (this.ftoolbar) === "boolean" && this.ftoolbar) {

            filters = $.parseJSON(postData.filters);
            if (filters && filters.groupOp === "AND" && typeof (filters.groups) === "undefined") {
                // only in case of advance searching without grouping we import filters in the
                // searching toolbar
                rules = filters.rules;
                for (i = 0, l = rules.length; i < l; i++) {
                    rule = rules[i];
                    iCol = getColumnIndex.call($this, rule.field);
                    if (iCol >= 0) {
                        cmi = cm[iCol];
                        control = $("#gs_" + $.jgrid.jqID(cmi.name));
                        if (control.length > 0 &&
                                (((typeof (cmi.searchoptions) === "undefined" ||
                                typeof (cmi.searchoptions.sopt) === "undefined")
                                && rule.op === myDefaultSearch) ||
                                  (typeof (cmi.searchoptions) === "object" &&
                                      $.isArray(cmi.searchoptions.sopt) &&
                                      cmi.searchoptions.sopt.length > 0 &&
                                      cmi.searchoptions.sopt[0] === rule.op))) {
                            tagName = control[0].tagName.toUpperCase();
                            if (tagName === "SELECT") { // && cmi.stype === "select"
                                control.find("option[value='" + $.jgrid.jqID(rule.data) + "']")
                                    .attr('selected', 'selected');
                            } else if (tagName === "INPUT") {
                                control.val(rule.data);
                            }
                        }
                    }
                }
            }
        }
    },
    templateClosed = {
        groupOp: "AND",
        rules: [
            { field: "closed", op: "eq", data: "true" }
        ]
    },
    templateLastWeek = {
        groupOp: "AND",
        rules: [
            { field: "invdate", op: "ge", "data": "13-Feb-2012" },
            { field: "invdate", op: "le", "data": "16-Feb-2012"}
        ]
    },
    templateLastMonth = {
        groupOp: "AND",
        rules: [
            { field: "invdate", op: "ge", "data": "16-Jan-2012" },
            { field: "invdate", op: "le", "data": "16-Feb-2012"}
        ]
    },
    myFilterTemplateLabel = 'Filter by Template:&nbsp;',
    myFilterTemplateNames = ['Closed', 'Last Week', 'Last Month'],
    myFilterTemplates = [templateClosed, templateLastWeek, templateLastMonth],
    iTemplate,
    cTemplates = myFilterTemplateNames.length,
    templateOptions = '',
    reloadWithNewFilterTemplate = function () {
        var iTemplate = parseInt($('#filterTemplates').val(), 10),
            postData = $grid.jqGrid('getGridParam', 'postData');
        if (isNaN(iTemplate)) {
            $grid.jqGrid('setGridParam', {search: false});
        } else if (iTemplate >= 0) {
            $.extend(postData, {
                filters: JSON.stringify(myFilterTemplates[iTemplate])
            });
            $grid.jqGrid('setGridParam', {search: true});
        }
        $grid.trigger('reloadGrid', [{current: true, page: 1}]);
    };

$grid.jqGrid({
    ...
    toolbar: [true, "top"],
    loadComplete: function () {
        var $this = $(this);

        if (typeof (this.ftoolbar) !== "boolean") {
            // create toolbar if needed
            $this.jqGrid('filterToolbar',
                {stringResult: true, searchOnEnter: true, defaultSearch: myDefaultSearch});
        }
        refreshSerchingToolbar.call(this, myDefaultSearch);
    }
});
$.extend($.jgrid.search, {
    multipleSearch: true,
    multipleGroup: true,
    recreateFilter: true,
    closeOnEscape: true,
    closeAfterSearch: true,
    overlay: 0,
    tmplLabel: myFilterTemplateLabel,
    tmplNames: myFilterTemplateNames,
    tmplFilters: myFilterTemplates
});
$grid.jqGrid('navGrid', '#pager', {edit: false, add: false, del: false});
for (iTemplate = 0; iTemplate < cTemplates; iTemplate++) {
    templateOptions += '<option value="' + iTemplate + '">' +
        myFilterTemplateNames[iTemplate] + '</option>';
}
$('#t_' + $.jgrid.jqID($grid[0].id)).append('<label for="filterTemplates">'+
    myFilterTemplateLabel + '</label>' +
    '<select id="filterTemplates"><option value="">Not filtered</option>' +
    templateOptions + '</select>');
$('#filterTemplates').change(reloadWithNewFilterTemplate).keyup(function (e) {
    // some web browsers like Google Chrome don't fire "change" event
    // if the select will be "scrolled" by keybord. Moreover some browsers
    // like Internet Explorer don't change the select option on pressing
    // of LEFT or RIGHT key. Another web browsers like Google Chrome do this.
    // We make refrech of the grid in any from the cases. If needed one
    // could modify the code to reduce unnneded reloading of the grid,
    // but for the demo with a few local rows it's such optimization
    // isn't really needed
    var keyCode = e.keyCode || e.which;

    if (keyCode === $.ui.keyCode.PAGE_UP || keyCode === $.ui.keyCode.PAGE_DOWN ||
            keyCode === $.ui.keyCode.END || keyCode === $.ui.keyCode.HOME ||
            keyCode === $.ui.keyCode.UP || keyCode === $.ui.keyCode.DOWN ||
            keyCode === $.ui.keyCode.LEFT || keyCode === $.ui.keyCode.RIGHT) {

        reloadWithNewFilterTemplate();
    }
});
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9308583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文