【问题标题】:jqGrid - Dynamically adding Rows Via JsonjqGrid - 通过 Json 动态添加行
【发布时间】:2011-03-17 09:12:16
【问题描述】:

我正在尝试根据用户在文本框中输入的值向我的 jqGrid 动态添加行。有一种方法可以从服务器获取 Json 请求,但我在获取它以添加实际数据时遇到问题。

这是 jqGrid 代码

function RenderGrid(grid) {
$("#queryGrid").jqGrid({
    datatype: grid.DataType,
    mtype: grid.RequestType,
    colNames: grid.ColumnNames,
    colModel: grid.ColumnModel,
    pager: $('#pager'),
    rowNum: grid.MaxViewableRows,
    caption: "Search",
    width: grid.Width,
    rowList: grid.MaxViewableRowOptions,
    height: grid.Height,
    loadtext: "Please wait...",
    viewrecords: grid.ShowTotalRecords,
    hidegrid: grid.HideEnabled,
    forceFit: true
})

我没有设置 URL 选项,因为正如我之前提到的,数据来自其他地方。然而这是 colModel

{"name":"id","index":"id","hidden":"true"},
{"name":"Customer","index":"Customer","sorttype":"Int32","editable":false,"width":216,"resizable":true},
{"name":"ShortName","index":"ShortName","sorttype":"String","editable":false,"width":216,"resizable":true},
{"name":"CorrespondenceName","index":"CorrespondenceName","sorttype":"String","editable":false,"width":216,"resizable":true}

这是获取 JSON 的代码

function SearchGrid() {
    $.ajax({
        url: $.url("/MyController/MyAction"),
        type: "POST",
        dataType: "json",
        data: {
            Name: $('#Name').val(),
            Fields: $('#Fields').text(),
        },
        success: ApplyDataToGrid //More on this later in the question
    });
}

这一切似乎都很好。我认为问题不在于上述任何代码。这就是棘手的地方,这是我获取 JSON 对象以及尝试将其添加到网格的地方。

这是我返回的 JSON

{"page":1,"records":1,"rows":[{"id":1,"cell":[94,"DAMIEN","IS AN IDIOT"]}],"total":1}

这是我用来(尝试)将数据添加到网格中的代码

function ApplyDataToGrid(data) {
    $("#queryGrid")[0].addJSONData(data, $("#queryGrid").bDiv, 0)   
}

function ApplyDataToGrid(data) {
    $("#queryGrid")[0].addJSONData(data)   
}

确实应用了页数和记录数,但它不显示应该添加 ID 和三列的行!

有什么想法吗?这让我疯狂! 提前致谢, 达米安

【问题讨论】:

  • 能否在问题正文中包含完整的grid,用于初始化$("#queryGrid").jqGrid?顺便说一句,您的代码有一些错误,例如 "sorttype":"Int32""sorttype":"String"sorttype 的所有可能值都可以找到 here。我建议您使用 data 参数而不是 addJSONData ahich 在大多数情况下具有优势。我发现用colModellabel 选项替换colNames 参数也很实用。

标签: jquery json jqgrid


【解决方案1】:

由于您正在调用 MVC 控制器来获取 json 数据,因此我建议您按照 Oleg 的建议进行操作 here。 您可以将 jqGrid 预加载为空,然后,当用户单击按钮或更改文本框中的某些文本时,您可以触发网格的重新加载:myGrid.trigger('reloadGrid',[{page:1}]);

您的网格将获取更改的字段并将其与请求一起发送:

postData: {
            Param1: function() { return $("#Filter1").val(); },
            Param2: function() { return $("#Filter2").val(); }
        }, 

如果您使用的是 ASP.NET MVC 2 或 3 并且发布数据,您的操作将如下所示:

  [HttpPost]
    public JsonResult SuccesMsg()
    {
        return Json(yourdata, JsonRequestBehavior.DenyGet);
    }

【讨论】:

  • 您使用的是 asp.net MVC,对吗?检查返回 Json(yourdata, JsonRequestBehavior.DenyGet); }
  • 我已经更新了我的答案。试试看是否有效。你可以在这里找到更多信息haacked.com/archive/2009/06/25/json-hijacking.aspx
  • 我正在使用 POST。数据确实来自服务器。由于某种原因,它根本不显示在 jqGrid..
  • 尝试在某处发布您的示例项目,因为我在这里无法获得太多信息。
  • 在我搞砸了一大堆事情之后,现在似乎可以工作了,但这个答案肯定是这条路的开始!干杯!
【解决方案2】:

不清楚您有哪种情况,因为您希望将数据附加到网格中,并且还希望获得正确的页数和记录数。 jqGrid 支持许多设置。您在有问题的测试网格中使用了哪些设置。例如datatype: grid.DataType 之类的代码太笼统了。如果您包含您在测试中使用但不起作用的所有 jqGrid 参数的值,这将非常有帮助。

sorttype":"String""sorttype":"Int32" 的设置肯定是错误的。可能你的意思是sorttype:"int" 和默认sorttype:"text"

也许您可以使用包含完整网格数据的data 参数更好地填充网格。如果您确实需要在现有网格中追加数据而不重新创建它,您可以使用适用于所有数据类型的addRowData。顺便说一句,它允许每次调用addRowData 将数据数组添加到网格中。

还有一个问题:您的网格有 4 列,而您仅包含三列的值:[94,"DAMIEN","IS AN IDIOT"]。我觉得很奇怪。可能你想使用 ["1", "94","DAMIEN","IS AN IDIOT"]?如果您在“id”列中包含“key:true”并包含jsonReader:{cell:""},则可以更改JSON数据的项目

{"id":1,"cell":["1","94","DAMIEN","IS AN IDIOT"]}

["1","94","DAMIEN","IS AN IDIOT"]

(见here)。

如果您准备一个示例没有任何 grid.DataType,会容易得多。只有在它运行良好之后,您才能使其更具动态性。

【讨论】:

  • 嗨奥列格。它部分使用您提供给另一个问题的解决方案来解决,该问题的接受答案也链接了。干杯。
  • @Damien:很好!在我写答案时,我没有看到您已经“接受”了 LeftyX 的答案。尽管如此,您至少应该在代码中修复 sorttype 值。
  • 哦,是的,关于排序值。我动态构建它们并使用 .Net 类型来做到这一点。
  • @Damien:我当然见过,但这是sorttype 的错误值。 Here 您将找到支持值的完整列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
  • 2010-12-24
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多