如何从 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>()
,这是错误的。如果数据具有组合键(多个值集是唯一的),那么您可以使用 '_'
(下划线)作为分隔符对键进行字符串连接。
免费的 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>()
,这是错误的。如果数据具有组合键(多个值集是唯一的),那么您可以使用 '_'
(下划线)作为分隔符对键进行字符串连接。