免费的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"]}
]
}
更新
我按照回答中的建议查找数据格式更改。 使用下面的代码从ASP.NET MVC4中的sql select语句创建jqgrid数据。 Web API将其序列化为json格式的json格式自动格式化。
如何创建可以序列化为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;
}
答案 0 :(得分:1)
最简单的方法是将服务器返回的数据格式用于使用repeatitems: false
数据样式。我指的是
{
"total": 1,
"page": 1,
"rows": [
{ "id": "2ARVELDUSARV", "Nimi": "2ARVELDUSARV" },
{ "id": "ACME", "Nimi": "ACME" },
{ "id": "KAKSKOERA", "Nimi": "KAKSKOERA"}
]
}
或将key: true
添加到列Nimi
{
"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:&#34; cell.0&#34; property to,表示从数组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
值。因此,我再说一遍,我建议您更改从服务器返回的数据格式。
更新:您问题的已更新部分制定了与
您只需对代码进行微小更改即可执行以下操作:首先应添加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<object>()
,这是错误的。如果数据具有组合键(多个值集是唯一的),那么您可以使用'_'
(下划线)作为分隔符来对键进行字符串连接。