You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JqGrid设置列默认搜索操作符问题:刷新后筛选重置

问题

能否为单个列设置默认搜索操作符?我有一个名为Severity的列,默认值为4,希望默认显示“le”(<=)操作符,筛选小于等于该值的数据。

目前的代码里,我通过postData设置了初始筛选规则,也手动修改过搜索工具栏的操作符,但点击刷新按钮后,Severity列的操作符会被重置为“eq”,要么想办法强制这个列始终用“le”,要么修复刷新按钮让它保留正确的操作符。

我的代码片段:

jQuery(document).ready(function() {
        jQuery('#grid').jqGrid({
            url:'logging.ajax',
            datatype: 'json',
            colModel:[
                {name:'Code', index:'Code', width:100, sorttype:'int', searchoptions:{sopt:['eq','cn','ne','nc','lt','le','gt','ge','bw','bn','in','ni','ew','en']}},
                {name:'Severity', index:'Severity', width:100, sorttype:'int', searchoptions:{defaultValue: 4, sopt:['eq','cn','ne','nc','lt','le','gt','ge','bw','bn','in','ni','ew','en']}},
                {name:'Log', index:'Log', align: 'left', width:200, searchoptions:{sopt:['eq','cn','ne','nc','bw','bn','in','ni','ew','en']}},
                {name:'ID', index:'ID', width: 100, sorttype:'int', key: true, searchoptions:{sopt:['eq','cn','ne','nc','lt','le','gt','ge','bw','bn','in','ni','ew','en']}}
            ],
            rowNum: 500,
            rowList: [100,200,500,1000],
            styleUI : 'Bootstrap',
            gridview: true,
            pager: '#gridpagernav',
            sortname: 'ID',
            loadonce: false,
            viewrecords: true,
            cellEdit: false,
            sortorder: 'desc',
            multiSort: true,
            ExpandColClick: true,
            forceFit: true,
            editurl:'logging.ajax',
            autowidth: true,
            shrinkToFit: false,
            height: Math.max(200, $(window).height()-400)
        }).navGrid('#gridpagernav',
            {
                edit: false,
                add: false,
                del: false,
                refresh: true,
                search: true,
                recreateForm: true
            }, //options
            {}, // edit options
            {}, // add options
            {}, // del options
            {
                closeAfterSearch: true,
                multipleSearch: true,
                multipleGroup: true,
                showQuery: false,
            } // search options
        ).filterToolbar({stringResult: true, searchOnEnter: false, defaultSearch: 'cn', ignoreCase: true, searchOperators: true});
});

我试过手动修改操作符:

$('.soptclass[colname=\"Severity\"]').attr('soper', 'le')
$('.soptclass[colname=\"Severity\"]').html('&lt;=')
$('.soptclass[colname=\"Log\"]').attr('soper', 'cn')
$('.soptclass[colname=\"Log\"]').html('~')

也加过初始筛选:

postData: { filters:JSON.stringify({'rules': [{'field':'Severity', 'op':'le', 'data':'4'}]}) },

但刷新后还是会重置成eq。


解决办法

1. 直接在列配置里指定默认操作符

修改Severity列的searchoptions,加上defaultSearch: 'le',这样该列默认就用le操作符,配合已有的defaultValue:4,初始化和刷新后都会保持这个设置。

修改后的colModel中Severity项:

{name:'Severity', index:'Severity', width:100, sorttype:'int', searchoptions:{defaultValue: 4, defaultSearch: 'le', sopt:['eq','cn','ne','nc','lt','le','gt','ge','bw','bn','in','ni','ew','en']}},

2. 监听刷新事件重置操作符和筛选规则

给grid绑定jqGridRefresh事件,刷新后重新设置Severity的操作符和筛选条件,避免被重置:

// 放在jqGrid初始化代码后面
$("#grid").on("jqGridRefresh", function() {
    // 重置操作符显示
    $('.soptclass[colname="Severity"]').attr('soper', 'le').html('<=');
    // 重新设置筛选规则
    var postData = $(this).jqGrid('getGridParam', 'postData');
    postData.filters = JSON.stringify({'rules': [{'field':'Severity', 'op':'le', 'data':'4'}]});
    $(this).jqGrid('setGridParam', {postData: postData}).trigger('reloadGrid');
});

3. 自定义刷新按钮的行为

替换默认的刷新按钮逻辑,确保刷新时保留当前的筛选条件(包括Severity的le操作符):

在navGrid的配置里添加refreshfunc:

.navGrid('#gridpagernav',
    {
        edit: false,
        add: false,
        del: false,
        refresh: true,
        search: true,
        recreateForm: true,
        // 自定义刷新逻辑
        refreshfunc: function() {
            // 获取当前筛选条件,没有的话设置默认规则
            var currentFilters = $("#grid").jqGrid('getGridParam', 'postData').filters;
            if (!currentFilters) {
                currentFilters = JSON.stringify({'rules': [{'field':'Severity', 'op':'le', 'data':'4'}]});
            }
            // 重新加载表格,带上筛选条件
            $("#grid").jqGrid('setGridParam', {
                datatype: 'json',
                postData: {filters: currentFilters}
            }).trigger('reloadGrid');
            // 重置操作符显示
            $('.soptclass[colname="Severity"]').attr('soper', 'le').html('<=');
        }
    },
    {}, {}, {}, {
        closeAfterSearch: true,
        multipleSearch: true,
        multipleGroup: true,
        showQuery: false,
    }
)

4. 强制搜索时使用le操作符

在filterToolbar的beforeSearch事件里,检查并修改Severity列的操作符,确保每次搜索都用le:

.filterToolbar({
    stringResult: true,
    searchOnEnter: false,
    defaultSearch: 'cn',
    ignoreCase: true,
    searchOperators: true,
    beforeSearch: function() {
        var postData = $(this).jqGrid('getGridParam', 'postData');
        if (postData.filters) {
            var filters = JSON.parse(postData.filters);
            // 遍历规则,找到Severity列并强制op为le
            for (var i = 0; i < filters.rules.length; i++) {
                if (filters.rules[i].field === 'Severity') {
                    filters.rules[i].op = 'le';
                    break;
                }
            }
            postData.filters = JSON.stringify(filters);
            $(this).jqGrid('setGridParam', {postData: postData});
        }
        return true;
    }
});

内容的提问来源于stack exchange,提问作者user21098501

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 18:52:37