0

我正在使用带有多选过滤器的 JQGrid 来过滤各个列。目前我正在使用数据库主值填充过滤器(例如 SkillCategory 列)

{
 name: 'SkillCategory', index: 'SkillCategory', width: '5%', sortable: true, resizable: true, stype: 'select',
  searchoptions: {
  clearSearch: false,
   sopt: ['eq', 'ne'],
    dataUrl: 'HttpHandler/DemandPropertyHandler.ashx?demprop=skillcat',
    buildSelect: createSelectList,
     attr: { multiple: 'multiple', size: 4 },
     position: {
      my: 'left top',
         at: 'left bottom'
        },
     dataInit: dataInitMultiselect
      }
    },

这种方法正在填充所有可用的主列表(用于技能类别)以进行过滤。我想仅显示基于特定列的可用行中存在的可用过滤器值(对于 SkillCategory)。这应该将“Programming”和“Data”显示为 SkillCategory 过滤器的选项,因为行仅包含该列的“Programming”和“Data”值。

在此处输入图像描述

在此处输入图像描述

我找到了下面的代码(抱歉忘记了链接)

getUniqueNames = function (columnName) {
            var texts = $("#listTableSupply").jqGrid('getCol', columnName), uniqueTexts = [],
            textsLength = texts.length, text, textsMap = {}, i;
            for (i = 0; i < textsLength; i++) {
                text = texts[i];
                if (text !== undefined && textsMap[text] === undefined) {
                    // to test whether the texts is unique we place it in the map.
                    textsMap[text] = true;
                    uniqueTexts.push(text);
                }
            }
            return uniqueTexts;
        }
        buildSearchSelect = function (uniqueNames) {
            var values = ":All";
            $.each(uniqueNames, function () {
                values += ";" + this + ":" + this;
            });
            return values;
        }
        setSearchSelect = function (columnName) {
            $("#listTableSupply").jqGrid('setColProp', columnName,
                    {
                        searchoptions: {
                            sopt: ['eq', 'ne'],
                            value: buildSearchSelect(getUniqueNames(columnName)),
                            attr: { multiple: 'multiple', size: 3 },
                            dataInit: dataInitMultiselect
                        }
                    }
        );
        }

调用 setSearchSelect("SkillCategory")

....  caption: 'Supply',
                emptyrecords: "No records to view",
                loadtext: "Loading...",
                refreshtext: "Refresh",
                refreshtitle: "Reload Grid",
                loadComplete: loadCompleteHandler1,
                ondblClickRow: function (rowid) {
                    jQuery(this).jqGrid('viewGridRow', rowid);
                },
                beforeRequest: function () //loads the jqgrids state from before save
                {
                    modifySearchingFilter.call(this, ',');
                }
            }).jqGrid('bindKeys');
            $('#listTableSupply').bind('keydown', function (e) {
                if (e.keyCode == 38 || e.keyCode == 40) e.preventDefault();
            });
            setSearchSelect("SkillCategory");
            $('#listTableSupply').jqGrid('navGrid', '#pagerSupply', {
                cloneToTop: true,
                refresh: true, refreshtext: "Refresh", edit: false, add: false, del: false, search: false
            }, {}, {}, {}, {
                multipleSearch: true,
                multipleGroup: true,
                recreateFilter: true
            }); .....

但似乎它不起作用。仅填充“全部”值。 在此处输入图像描述

任何想法我怎么能做到这一点。

更新1:

根据奥列格的建议,下面是对我有用的工作代码。

initializeGridFilterValue = function () {

            //jQuery("#listTableSupply").jqGrid('destroyGroupHeader');
            setSearchSelect("SkillCategory");

            jQuery("#listTableSupply").jqGrid("filterToolbar", {
                stringResult: true,
                searchOnEnter: true,
                defaultSearch: myDefaultSearch,
                beforeClear: function () {
                    $(this.grid.hDiv).find(".ui-search-toolbar .ui-search-input>select[multiple] option").each(function () {
                        this.selected = false; // unselect all options
                    });

                    $(this.grid.hDiv).find(".ui-search-toolbar button.ui-multiselect").each(function () {
                        $(this).prev("select[multiple]").multiselect("refresh");
                    }).css({
                        width: "98%",
                        marginTop: "1px",
                        marginBottom: "1px",
                        paddingTop: "3px"
                    });
                }
            });
            jQuery("#listTableSupply").jqGrid('setGridHeight', 300);
        }

并从 loadComplete 事件中设置它,如下所示:

function loadCompleteHandler1() {
            initializeGridFilterValue();
        }
4

1 回答 1

2

我看到您使用了我的旧答案中的代码。关于您的问题:我想您首先调用filterToolbar创建过滤器工具栏,然后才调用setSearchSelect设置新searchoptions.value属性。另一个可能的问题是您在将数据加载到网格setSearchSelect 之前调用。如果使用datatype: "local"withdata参数,则在创建网格期间将数据填充到网格中。如果你使用datatype: "json",那么你应该首先从服务器加载数据,setSearchSelect然后filterToolbarloadComplete. 例如,如果您使用loadonce: truethen 您可以测试datatype内部参数的值loadComplete。如果值为,"json"则您对数据进行了初始加载。所以你应该打电话setSearchSelect,然后如果需要调用destroyFilterToolbar,最后调用 filterToolbar创建过滤器工具栏,其中选择将具有所有必需的值。

于 2014-11-17T13:01:28.870 回答