我的ASP.NET MVC 3应用程序上有一些jqGrids,它们有很多列.我在列定义中添加了以下内容,以默认隐藏一些列:
colModel: [
{ name: 'IceCreamID', hidden: true},
{ name: 'RecipeID', hidden: true }
Run Code Online (Sandbox Code Playgroud)
这很好用.这些列在我的网格上不可见.
然后我添加了这个来实现列选择器:
var grid = $('#icecreamGrid');
grid.jqGrid('navButtonAdd', '#icecreamPager',
{ caption: "Columns", buttonicon: "ui-icon-calculator",
title: "Choose Columns",
onClickButton: function() {
grid.jqGrid('columnChooser');
}
});
Run Code Online (Sandbox Code Playgroud)
太棒了,现在提出了专栏选择器.然后我将以下内容添加到我从未希望在列选择器中显示的列中:
colModel: [
{ name: 'IceCreamID', hidden: true, hidedlg: true},
Run Code Online (Sandbox Code Playgroud)
所以我现在可以隐藏/显示列就好了.现在,您如何坚持这些信息?D B?作为一个cookie?另一种方式?是否有一种首选的方式来存储这种真正是用户偏好的信息,而不是与数据本身相关的信息?
更多信息
根据Oleg在下面的评论,我想提供更多信息.
这里的要点是我有10-15列的网格,可以根据用户的偏好显示.举一个简单的例子,我的一个网格有以下9列:
IceCream|ShortName|HasNuts|SugarAdded|LimitedRun|PromoItem|Facility|FirstRun|LastRun
Run Code Online (Sandbox Code Playgroud)
用户可以根据个人喜好隐藏/显示这9列中的任何一列.
我想要做的是提供一种方法来持久保存特定用户想要查看的列,以便他/她不必在每次显示带有该网格的页面时重新选择这些列.
我正在使用jqGrid和过滤器工具栏,我需要为其中一个字段设置初始默认过滤器值,以便默认情况下只显示状态为"打开"的行,但如果需要,用户可以显示"已关闭"行.
目前我有这样的解决方法
setTimeout(function() {$('#gs_Status').val('Open');$("#eventsGrid")[0].triggerToolbar()},500);
但它导致第二个请求,真的很糟糕.
有人知道怎么做这个吗?
编辑:更多研究告诉我这可能是不可能的:(
如果再次打开网格或刷新页面,如何预先确定当前行?
持久化jqGrid列首选项中的答案描述了如何保持列宽和其他一些参数.
在这个答案演示中,我点击了一行并按了F5.之前单击的行未突出显示.如何在本地存储中保存/恢复当前行?
更新
如果在应用程序中修改了jqGrid列结构,并且用户再次从浏览器打开应用程序,则restorecolumnstate会创建无效的colmodel,其中缺少某些元素.这会导致refreshSearchingToolbar中出现异常,该异常假定存在所有colmodel元素.
如何解决这个问题?在这种情况下如何设计修改后的colmodol而不是恢复colmodel?或者应该restoreColumnState更新colModel以便创建正确的数组?
**更新2**
如果myColumnsState.permutation包含空值,则$grid.jqGrid("remapColumns", myColumnsState.permutation, true)创建无效的colmodel.以下是在remapColumns调用之前和之后立即从VS调试器截取的屏幕截图
后:

我通过chaning代码来解决这个问题
if (isColState && myColumnsState.permutation.length > 0) {
var i, isnull = false;
for (i = 0; i < myColumnsState.permutation.length; i = i + 1) {
if (myColumnsState.permutation[i] == null) {
isnull = true;
break;
}
}
if (!isnull) {
$grid.jqGrid("remapColumns", myColumnsState.permutation, true);
}
Run Code Online (Sandbox Code Playgroud)
这是最佳解决方案吗?
在使用jqGrid开发我的第一个ASP.NET MVC 3应用程序来显示一些数据时,我正在使用列标题过滤器,并且还允许完成高级过滤器工具栏过滤.独立地这些东西工作得很好.
第一个问题 -有没有人能够将当前列标题过滤器设置传达给高级过滤器?
例如,用户可以过滤"冰淇淋名称"列,输入部分名称,例如"巧克力",它将过滤到"巧克力爆炸","黑巧克力"等 - 很棒.最好的方法是打开高级过滤器,并在高级过滤器中自动填充"包含'巧克力'"列过滤器.我认识到另一个方向(有人可以对同一列进行AND或OR两个值,例如'Chocolate'Or'Carramel')成为问题,但在另一个方向上,似乎有可能.也许这只是我缺少的网格设置.有人解决了吗?
第二个问题 -我目前可以使用列标题过滤器进行一些过滤,在网格中显示一些结果集,然后进入高级过滤器对话框并设置不同的过滤器.这将显示正确的结果,但不清除列标题过滤器,给人的印象是过滤不起作用.如何在用户单击对话框上的"查找"按钮后重置这些列标题过滤器?