【问题标题】:How to remove extra column value from jqgrid json data如何从 jqgrid json 数据中删除额外的列值
【发布时间】:2015-12-05 15:39:43
【问题描述】:

免费的 Jqgrid 有操作栏。模型:

{"hidden":false,"label":"","name":"_actions","width":72
,"align":"left","template":"actions","fixed":false,"resizable":true,
  "formatoptions":{"editbutton":true,"delbutton":true,"delOptions":{"url":"Delete" }}},

{"label":"Nimetus","name":"Nimi","index":"Nimi","editoptions":{"maxlength":80,"size":80 }

它是从远程 json 数据中填充的,例如

{"total":1,
 "page":1,
  "rows":[{"id":"2ARVELDUSARV", "cell":[null,"2ARVELDUSARV"]},
          {"id":"ACME","cell":[null,"ACME"]},
          {"id":"KAKSKOERA","cell":[null,"KAKSKOERA"]}
 ]
}

在元胞数组中,第一列未使用。 如果删除此列,jqgrid 将无法正确呈现数据,因为此列需要作为操作列的占位符。 如何解决这个问题,以便 jqgrid 接受没有第一列的数据:

{"total":1,
 "page":1,
  "rows":[{"id":"2ARVELDUSARV", "cell":[null,"2ARVELDUSARV"]},
          {"id":"ACME","cell":["ACME"]},
          {"id":"KAKSKOERA","cell":["KAKSKOERA"]}
 ]
}

更新

我按照答案中的建议寻找数据格式更改。 jqgrid 数据是使用下面的代码从 ASP.NET MVC4 中的 sql select 语句创建的。 Web API 自动将其序列化为 jqgrid 的 json 格式。

如何创建可以序列化为属性名的结果:答案中推荐的值格式?

  object GetDataForJqGrid() {
        IDbConnection conn;
        using (var dataReader = DataAccessBase.ExecuteReader(sql.ToString(), out conn,
               CommandBehavior.CloseConnection | CommandBehavior.SingleResult,
               sql.GetParameters.ToArray()))
        {
            var rowList = new List<GridRow>();
            var pkeys = DatabasePrimaryKey();
            while (dataReader.Read())
            {
                var pkv = new List<object>();
                int offset = 1; // required for actions column
                var row = new GridRow
                {
                    id = IdHelper.EncodeId(pkv),
                    cell = new object[dataReader.FieldCount + offset + imageCount]
                };
                for (int j = 0; j < dataReader.FieldCount; j++)
                   row.cell[offset + j] = dataReader.GetValue(j);
                rowList.Add(row);
            }

            return new
            {
                total = rowList.Count() < rows ? page : page + 1,                                  page, 
          rows = rowList
            };
}

public class GridRow
{
    public string id;
    public object[] cell;
}

【问题讨论】:

    标签: json asp.net-mvc jqgrid free-jqgrid


    【解决方案1】:

    最简单的方法是将服务器返回的数据格式更改为使用repeatitems: false 数据样式。我的意思是

    {
        "total": 1,
        "page": 1,
        "rows": [
            { "id": "2ARVELDUSARV", "Nimi": "2ARVELDUSARV" },
            { "id": "ACME", "Nimi": "ACME" },
            { "id": "KAKSKOERA", "Nimi": "KAKSKOERA"}
        ]
    }
    

    或者,在Nimi列的定义中添加key: true之后

    {
        "total": 1,
        "page": 1,
        "rows": [
            { "Nimi": "2ARVELDUSARV" },
            { "Nimi": "ACME" },
            { "Nimi": "KAKSKOERA"}
        ]
    }
    

    而不是

    {
        "total": 1,
        "page": 1,
        "rows": [{
            "id": "2ARVELDUSARV",
            "cell": ["2ARVELDUSARV"]
        }, {
            "id": "ACME",
            "cell": ["ACME"]
        }, {
            "id": "KAKSKOERA",
            "cell": ["KAKSKOERA"]
        }]
    }
    

    或者,您可以将jsonReader: { repeatitems: false } 事件与您当前的数据格式一起使用并添加 jsonmap: "cell.0" 属性,这意味着从数组 cell 中获取第一个元素(索引 0):

    $("#list").jqGrid({
        datatype: "json",
        url: "andrus.json",
        colModel: [
            { label: "", name: "_actions", template: "actions" },
            { label: "Nimetus", name: "Nimi", jsonmap: "cell.0" }
        ],
        iconSet: "fontAwesome",
        jsonReader: { repeatitems: false }
    });
    

    the demo

    我个人建议您不要使用原始格式(cell 带有值数组),而只使用带有附加 id 属性的命名属性(如果 id 值尚未包含在项目中) .如果您确实使用jsonmap 的解决方案,您应该小心更改列的顺序(使用remapColumns)并稍后重新加载数据。在更改列顺序后,您可能需要更新 jsonmap 值。因此,我再次重申,我建议您更改从服务器返回的数据格式。

    已更新:您问题的已更新部分制定了与 jqGrid 无关的绝对新问题。这是纯粹的 C# 问题。尽管如此,我还是尝试回答,因为我也使用 C#。

    您可以通过对代码的最小更改来执行以下操作:您应该首先添加using System.Dynamic;using System.Linq;。然后你应该把using (...) {...}里面的代码替换成下面的样子

    var rowList = new List<dynamic>();
    while (dataReader.Read()) {
        var row = new ExpandoObject() as IDictionary<string, object>;
        for (int j = 0; j < dataReader.FieldCount; j++) {
            if (!dataReader.IsDBNull(j)) {
                row.Add(dataReader.GetName(j), dataReader.GetValue(j));
            }
        }
        rowList.Add(row);
    }
    

    rowList 的序列化将产生名称属性。如果你知道数据的主键,那么你可以用同样的方法添加id属性对应的值(使用row.Add("id", IdHelper.EncodeId(pkv)))。我没有包括该部分,因为您发布的代码不完整,pkv 目前始终为new List&lt;object&gt;(),这是错误的。如果数据有组合键(多个值集是唯一的),那么您可以使用'_'(下划线)作为分隔符对键进行字符串连接。

    【讨论】:

    • 我尝试更改数据格式,但不知道如何创建它,以便它可以被 Web API 正确序列化。我更新了问题。
    • 可以将 columnNames 属性添加到 json 响应中。这包含结果数组中的所有列名。它可以保存在本地存储中并在恢复状态之前进行验证。这避免了每一行的属性名称重复,并使数据大小更小。
    • @Andrus:您问题的 "Update" 部分制定了绝对新问题,与 jqGrid 没有直接关系。这是纯粹的 C# 问题。尽管如此,我还是尝试在答案的 UPDATED 部分中回答它。
    • 谢谢。很棒的更新。我在codeproject.com/Tips/1050214/… 找到了类似的解决方案
    • @Andrus:很有趣!代码真的很接近,但是我独立编写了我的代码。我认为在代码中使用ExpandoObject 真的很自然。顺便说一句,从评论到the post 的代码对我来说看起来更好。我的意思是params DbParameter[] parametersDictionary&lt;string, object&gt; Parameters 更好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    相关资源
    最近更新 更多