我最近写了一个问题" jqGrid显示默认"加载"更新表/自定义更新时的消息 "的答案.在编写答案时,我想:为什么他使用addJSONData()函数刷新网格中的数据而不是相对于setGridParam()更改URL 并刷新jqGrid数据相对于trigger('reloadGrid')?一开始我想推荐使用'reloadGrid',但在考虑了这一点后,我明白我不太确定最好的方法是什么.至少,我不能用两句话解释为什么我更喜欢第二种方式.所以我认为它可能是一个有趣的讨论主题.
确切地说:我们有一个典型的情况.我们有一个网页,其中包含至少一个jqGrid和一些其他控件,如组合框(选择),复选框等,这使用户可以更改jqGrid中显示的信息的范围.通常我们定义一些事件处理程序jQuery("#selector").change(myRefresh).keyup(myKeyRefresh)
,我们需要根据用户的选择重新加载jqGrid容器.
在阅读并分析来自其他用户输入的信息后,我们可以至少以两种方式刷新jqGrid容器:
$.ajax()
手动然后在成功内部或完成$.ajax
调用句柄jQuery.parseJSON()
(或eval
),然后调用jqGrid的addJSONData函数.我在stackoverflow.com上发现了很多使用addJSONData的例子.我希望我们讨论这两种方式的优缺点.我目前使用第二种方式,所以我将从这一方面的优势开始.
可以说:我调用现有的Web服务,将接收的数据转换为jqGrid格式并调用addJSONData.这就是我使用addJSONData方法的原因!
好的,我会选择另一种方式.jqGrid可以直接在Web服务上调用并在网格内填充结果.有很多jqGrid选项,允许您自定义此过程.
首先,可以删除或重命名发送到服务器关于任何标准参数prmNames的jqGrid的选项或对于添加任何额外的参数POSTDATA选项(参见http://www.trirand.com/jqgridwiki/ doku.php?id = wiki:options).$.ajax
通过定义serializeGridData()函数(jqGrid的另一个选项),可以在jqGrid发出相应请求之前立即修改所有构造的参数.更重要的是,可以$.ajax
通过设置jqGrid的ajaxGridOptions选项来更改每个参数.我用ajaxGridOptions: {contentType: "application/json"}
例如作为一般设置$.jgrid.defaults
.该ajaxGridOptions选项是非常强大的.对于ajaxGridOptions …
我有一个这样的表格:
<form id='myForm'>
<input type='text' name='search' />
<input type='text' name='maxPrice' />
</form>
Run Code Online (Sandbox Code Playgroud)
和我的jqGrid表:
<table id='myGrid'></table>
Run Code Online (Sandbox Code Playgroud)
我需要POST(不要GET)数据从myForm
我的服务器方法,以获取行数据并填充网格.到目前为止,我还没有能够让jqGrid发布任何东西.我仔细检查了我的数据序列化,并正确地序列化我的表单数据.这是我的jqGrid代码:
$("#myGrid").jqGrid({
url: '/Products/Search") %>',
postData: $("#myForm").serialize(),
datatype: "json",
mtype: 'POST',
colNames: ['Product Name', 'Price', 'Weight'],
colModel: [
{ name: 'ProductName', index: 'ProductName', width: 100, align: 'left' },
{ name: 'Price', index: 'Price', width: 50, align: 'left' },
{ name: 'Weight', index: 'Weight', width: 50, align: 'left' }
],
rowNum: 20,
rowList: [10, 20, 30],
imgpath: gridimgpath,
height: 'auto',
width: '700',
//pager: $('#pager'), …
Run Code Online (Sandbox Code Playgroud) 我的要求是显示一个包含多个过滤器的页面以应用于网格数据.
假设我们正在谈论订单,订单具有以下属性
public class Order {
public int OrderID
public DateTime OrderDate
public DateTime ShipmentDate
public int OrderTotal
public int OrderStatus
}
Run Code Online (Sandbox Code Playgroud)
在jqgrid对象中,我显示除OrderStatus之外的所有属性
要求是创建一个具有的视图
在右侧面板中,用户将看到一个复选框列表,表示每个可能的OrderStatus值,并且他希望使用这两种方法进行搜索(例如,选中"已发货订单"复选框,然后使用大于某个值的金额过滤网格)
我已经multiplesearch:true
在jqGrid对象中配置了高级过滤(),我可以创建组合字段和逻辑运算符的复杂过滤器.
有关如何在用户按下搜索按钮时从右侧面板提交数据的任何想法?
更新1:
序言:Oleg样品太棒了但不幸的是不符合我的客户要求:(
@Oleg:我不明白你为什么这么想:
如果数据位于网格之外,您将仅在选定行的右窗格中显示订单详细信息.因此,用户将不太了解数据.
也许我的描述不是那么清楚,但我不会显示任何订单细节.为了更好地阐明我的要求,我修改了您的示例,以显示所需的最终用户界面,如下图所示:
客户希望使用两种方法或两者同时过滤网格中的数据:
multiplesearch
网格本身提供的设施(感谢提到的解决方法)从功能的角度来看,需求很容易表达:当用户单击复选框或使用本机进行搜索时,multiplesearch
我应该将值发布到服务器,包括复选框状态.
总结一下,我应该:
multiplesearch
multiplesearch
当用户单击复选框时添加当前状态(如果有)有没有办法做到这一点?
我有一个页面上有一个jqgrid,顶部有过滤行.我希望在另一个页面上有一个链接来加载这个网格页面,但是在其中一个列上设置了过滤器.可以通过链接或人们可以建议的任何其他解决方法来做到吗?
我从模型类生成我的jqgrid,我将其传递给视图.我得到了构建和工作jqgrid.但是,在我调用helper创建jqgrid之后,我想在一个视图上设置postData,在那里我使用jqGrid,在该视图中使用脚本,而不必更改创建jqgrid的整个局部视图.
我试过跑步
$("#@Model.Id").jqGrid('setGridParam', { postData: { test: 233} });
Run Code Online (Sandbox Code Playgroud)
和
$("#@Model.Id").setGridParam({ postData: { test: 233} });
Run Code Online (Sandbox Code Playgroud)
但没有错误或任何结果.如果我在jqgrid参数中设置postData(在部分视图中构造它,它可以工作.
我还检查了网格存在,补充说
console.log($("#@Model.Id").size());
Run Code Online (Sandbox Code Playgroud)
在第一行之前,它显示1.
更新:这个.setGirdParam函数开始为我工作没有明显的原因,所以如果有人可以提供一些可以阻止这种工作的见解,我会接受回答.谢谢
我在jqGrid之外有过滤器,应该触发网格重新加载.这个条目让我对如何实现它有了一些很好的了解,使用postData选项:如何过滤jqGrid数据不使用内置的搜索/过滤器框 不幸的是代码片段是片段,我无法弄清楚整个序列是什么电话应该是.这是我当前方法的简要视图:
<script>
$(document).ready(function() {
$("#submit").click(function(e) {
e.preventDefault();
myGrid.trigger('reloadGrid');
});
});
var url="${servicesUrl}/projects";
var myGrid = $("#projectList").jqGrid({
url: url,
datatype: 'json',
mtype: 'GET',
// ...
});
</script>
Run Code Online (Sandbox Code Playgroud)
我应该如何构建代码,以便每次单击"提交"按钮都会触发网格重新加载?一旦我解决了这个问题,我确信我能够添加posData部分,我的问题主要是整个调用顺序.我不确定哪个调用应该在ready()函数内部,以及如何正确调用'reloadGrid'.任何帮助非常感谢.
只是想更好地了解JqGrid
事件过程
基于此事件
ajax
请求中向服务器添加过滤器或额外参数,我应该在loadBeforeSend中执行吗?因为我的工作要求我在向服务器发送请求时添加额外的参数,并且在收到数据之后,我需要阻止网格在网格上显示数据,以便我可以在显示处理数据之前进一步处理数据网格.但我似乎无法掌握JqGrid应该将我的功能放到哪个事件.
谢谢
编辑:
对于postData部分
loadBeforeSend: function() {
if (sessionStorage.pathStates == "edit" && location.pathname.indexOf("list") > -1) {
console.log("SUCCESS");
loadFilter();
}
},
Run Code Online (Sandbox Code Playgroud)
和loadFilter
function loadFilter() {
var filter = JSON.parse(sessionStorage.filter);
var filterInput = [],
model = [],
filters = {};
filterInput = filter.filterInput;
model = filter.model;
var grid = filter.grid,
page = filter.page,
op = "bw",
a = 0,
b = 0; …
Run Code Online (Sandbox Code Playgroud) 我正在使用jqGrid,在编辑/添加功能上我希望在其中一个字段中有一个下拉列表.
如果我使用setSelect函数,这是有效的:
$grid->setSelect("title", "SELECT DISTINCT name,name as TestingName FROM template", true, true, false, array(""=>"All"));
Run Code Online (Sandbox Code Playgroud)
如何将参数传递给我的查询?我试过这些:
1-"SELECT DISTINCT name,name as TestingName FROM template where tempid = ?"
2- "SELECT DISTINCT name,name as TestingName FROM template where tempid = $rowid"
3-"SELECT DISTINCT name,name as TestingName FROM template where tempid = ". $rowid
具有以下功能:
if(isset ($_REQUEST["tempid"]))
$rowid = jqGridUtils::Strip($_REQUEST["tempid"]);
else
$rowid = "";
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用jqgrid构建一个系统,该系统在客户端执行所有操作,即使用AJAX检索JSON对象(使用C#/ .Net)并将其缓存在javascript变量中,然后从该缓存中填充多个网格(addRowData) ,取决于数据.这一切都很好.
但是,我现在在发现如何做一些更高级的事情时遇到了问题.
1)在没有服务器交互的情况下分页/排序数据.这可能吗?或者它是否需要我编写自定义分页功能(即当用户移动到第2页时,从缓存中获取下10条记录并使用它们更新网格).希望有一种自动方式来做到这一点?排序怎么样?阅读一些建议它完成服务器端的东西,但也许它们是旧文章?不确定.
2)允许用户在每一行上查看控件(主要是单选按钮和日期选择器),并将这些更改反映在缓存变量中.我查看了jqGrid的编辑功能,但这似乎是"点击/编辑/保存".理想情况下,我希望网格的初始显示显示,例如,每行显示一对单选按钮的列,用户只需单击他们感兴趣的那些(即他们不必明确地"编辑" "要查看/更改单选按钮的行.此数据在网格中更新,更重要的是在驱动网格的缓存变量中更新.是否有自动方法将每行的控件绑定到底层客户端数据集?如何在每个单元格中创建控件并将其值与单元格值相关联?
有人可以指出我正确的方向吗?
谢谢你提供的所有帮助,
法案
我和jqgrid一起战斗了大约8天(或更长时间),我做了一切除了小小的事情.我有一个大型数据库,我试图按部分显示它.我的意思是,SQL查询被执行每当时间next
,prev
,last
,first
或者当用户输入一个页码.我管理了它,一切都是正确的,但现在网格没有显示正确的最后一页.我的意思是,即使有42页,它显示1中的1.
现在,当我输入页码时,网格正在刷新并显示正确的结果,但是寻呼机说的是1 of 1,5 of 1,依此类推.
我用过的是:
jQuery("#list").jqGrid({
datatype: "jsonstring",
datastr: JSON.stringify(gridDtls),
jsonReader:{
root: "rows",
page: "page",
total: "total",
records: "records",
repeatitems: false,
id: "0"
},
Run Code Online (Sandbox Code Playgroud)
我每次点击一个按钮时用来运行查询的代码都在这里(注意下面的代码仅在按下enter时工作,因为按钮处于非活动状态):
onPaging: function(pgButton){
var status = returnUserStatus();
var page1 = $(this).jqGrid("getGridParam", "page");
var totalPages = $(this).getGridParam('lastpage');
if(pgButton=="next_pager"){
}
if(pgButton=="prev_pager"){
}
if(pgButton=="last_pager"){
}
if(pgButton=="first_pager"){
}else if((pgButton !="first_pager") && (pgButton !="last_pager") && (pgButton !="prev_pager") && (pgButton !="next_pager"))
},
Run Code Online (Sandbox Code Playgroud)
一切似乎都对我不对.为什么jqgrid没有返回正确的页面?我确信我错过了一些小的东西.请帮我!!!