如何从 jqgrid json 数据中删除额外的列值

How to remove extra column value from jqgrid json data

免费的 Jqgrid 有操作栏。 colmodel:

{"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 将其序列化为 json for jqgrid 自动格式化。

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

  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;
}

最简单的方法是更改​​从服务器返回的数据格式,以使用数据的 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" 属性 到,这意味着从数组中获取第一个元素(索引 0) cell:

$("#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 将生成名称属性。如果你知道数据的主键,那么你可以用同样的方法(使用row.Add("id", IdHelper.EncodeId(pkv)))将id 属性 与相应的值相加。我没有包含该部分,因为您发布的代码不完整并且 pkv 目前始终是 new List<object>(),这是错误的。如果数据具有组合键(多个值集是唯一的),那么您可以使用 '_'(下划线)作为分隔符对键进行字符串连接。