I posted an example of the usage of Multiselect widget in free jqGrid in the old answer. The later versions of free jqGrid suports "in"
operation, which is very practical in case of usage Multiselect widget.
I created the new demo for you, which looks like on the picture below.

It loads the input data from testJsonData.json, find all unique values for ship_via
column inside of beforeProcessing
and set the searchoptions.value
built based on the values. The demo uses the latest code of free jqGrid from GitHub (it's more recent as 4.13.4). I plan to publish soon the curent code from GitHub as 4.13.5 or 4.14.0. the demo uses the current v1.17 version of Multiselect widget creates by Eric Hyndse. The code of the demo is
var getUniqueNames = function (columnName, mydata) {
var texts = $.map(mydata, function (item) {
return item[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 = "";
$.each(uniqueNames, function () {
values += this + ":" + this + ";";
});
return values.slice(0, -1);
},
initMultiselect = function (searchOptions) {
var $elem = $(searchOptions.elem),
options = {
selectedList: 2,
height: "auto",
checkAllText: "all",
uncheckAllText: "no",
noneSelectedText: "Any",
open: function () {
var $menu = $(".ui-multiselect-menu:visible");
$menu.addClass("ui-jqdialog").width("auto");
$menu.find(">ul").css("maxHeight", "200px");
}
};
if (searchOptions.mode === "filter") {
options.minWidth = "auto";
}
$elem.multiselect(options);
$elem.siblings("button.ui-multiselect").css({
width: "100%",
margin: "1px 0",
paddingTop: ".3em",
paddingBottom: "0"
});
},
setSearchSelect = function (columnName, data) {
var values = buildSearchSelect(getUniqueNames.call(this, columnName, data));
$(this).jqGrid("setColProp", columnName, {
stype: "select",
searchoptions: {
value: values,
sopt: ["in"],
attr: {
multiple: "multiple",
size: 4
},
selectFilled: initMultiselect
}
});
},
myDefaultSearch = "cn",
beforeProcessingHandler1 = function (data) {
var $this = $(this), p = $this.jqGrid("getGridParam");
// !!! it will be called only after loading from the server
// datatype is always "json" here
setSearchSelect.call(this, "ship_via", data);
if (this.ftoolbar === true) {
// if the filter toolbar is not already created
$("#gs_" + this.id + "ship_via").multiselect("destroy");
$this.jqGrid('destroyFilterToolbar');
}
if (p.postData.filters) {
p.search = true;
}
$this.jqGrid("filterToolbar", {
//stringResult: true,
defaultSearch: myDefaultSearch,
beforeClear: function () {
$(this.grid.hDiv)
.find(".ui-search-toolbar button.ui-multiselect")
.each(function () {
$(this).prev("select[multiple]").multiselect("refresh");
});
}
});
};
$("#list").jqGrid({
url: "testJsonData.json",
datatype: "json",
colNames: ["Client", "Amount", "Tax", "Total", "Shipped via", "Notes"],
colModel: [
{ name: "name", width: 65 },
{ name: "amount", width: 75, template: "number" },
{ name: "tax", width: 52, template: "number" },
{ name: "total", width: 65, template: "number" },
{ name: "ship_via", width: 85, align: "center" },
{ name: "note", width: 100, sortable: false }
],
rowNum: 5,
sortname: "name",
iconSet: "fontAwesome",
autoencode: true,
loadonce: true,
forceClientSorting: true, // local sorting and filtering data loaded from the server
beforeProcessing: beforeProcessingHandler1,
rowList: [5, 10, 20, 30, 100],
pager: true,
pagerRightWidth: 120, // fix wrapping or right part of the pager
viewrecords: true,
sortable: true
}).jqGrid("navGrid", { add: false, edit: false, del: false, search: false });