jqGrid 使用示例

JQGrid是一个在jquery基础上做的一个表格控件,纯粹做数据前台展示,数据源以ajax的方式和服务器端通信获取。

官方demo见http://trirand.com/blog/jqgrid/jqgrid.html

api说明见http://www.trirand.com/jqgridwiki/doku.php?id=wiki:jqgriddocs

下面是服务端返回json数据格式的示例:

1、jqGrid以loadonce=true的方式获取数据,数据从服务器只加载一次到前台,客户端自动分页,客户端分页参数不再回传到服务端的请求参数里面

客户端

先构造表格控件(最后两列添加自定义格式的列),            

       jQuery("#list").jqGrid(           
      { datatype:
"local", height: 'auto', autowidth: true, colNames: ['id', '车牌号码', '手机号码', '修改', "添加"], colModel: [ { name: 'int_rransportvehicle', index: 'int_rransportvehicle', hidden: true }, { name: 'vc_veh', index: 'vc_veh' }, { name: 'vc_phone', index: 'vc_veh' } , { name: 'edit', index: 'edit', width: 20, editable: false, formatter: idFormatEdit } , { name: 'add', index: 'add', width: 20, editable: false, formatter: idFormatAdd } ], rowNum: 10, rowList: [10, 20, 30], sortname: 'vc_veh', pager: "#pager", viewrecords: true, loadonce: true , onSelectRow: function (rowid) {
            //事件的rowid和下面方法取的selectedid相同,现在表格控件的选中行的行id
var selectedId = $("#list").jqGrid("getGridParam", "selrow");
            //选中的行数据
var rowData = $("#list").jqGrid("getRowData", selectedId); } }).navGrid('#pager', { edit: false, add: false, del: false });        //格式化数据,三个参数必须依次 function idFormatEdit(cellvalue, options, rowObject) { return "<a href='./TransfortVehAdd.aspx?ID="+rowObject.int_rransportvehicle.toString()+ "&Edit=1'><img src='Styles/edit_16.png' style=\"cursor:pointer;\"/></a>"; }
function idFormatAdd(cellvalue, options, rowObject) { return "<a href='./TransfortVehAdd.aspx'><img src='Styles/add_16.png' style=\"cursor:pointer;\"/></a>"; }

利用ajax获取数据重新加载jgGrid表格显示数据

            function getGridData(areaid, keywords)
            {
                $.post("Handler.ashx", { action: "getVehs", areaid: areaid, keywords: keywords }, function (ajax)
                {
                    $("#list").jqGrid("clearGridData", true).trigger("reloadGrid");
                    $("#list").jqGrid('setGridParam', {
                        datatype: "local",
                        data: eval(ajax)//服务器返回的json格式,此处转换后给数据源赋值
                    }).trigger("reloadGrid");
                });
            }

服务端,需要引入Newtonsoft.Json.dll做json转换返回数据

    public void ProcessRequest(HttpContext context)
    {
        context.Response.Buffer = true;
        context.Response.ExpiresAbsolute = DateTime.Now.AddDays(-1);
        context.Response.AddHeader("pragma", "no-cache");
        context.Response.AddHeader("cache-control", "");
        context.Response.CacheControl = "no-cache";
        context.Response.ContentType = "text/plain";

        string action = context.Request.Params["action"].ToString();
        switch (action)
        {
            case "getVehs":
                getVehs(context);
                break;
            default:
                break; 
        }
    }
    /// <summary>
    /// 获取交通车列表
    /// </summary>
    /// <param name="context"></param>
    void  getVehs(HttpContext context)
    {
        DataTable dt;
        string jsonData = string.Empty;

        DataSet sResult = DJ.DB.DataHelper.GetVehList(context.Request.Params["areaid"].ToString(), context.Request.Params["keywords"].ToString());
        dt = sResult.Tables[0];
        int iCount = dt.Rows.Count;

        IsoDateTimeConverter idtc = new IsoDateTimeConverter();
        idtc.DateTimeFormat = "yyyy-MM-dd hh:mm:ss ffffff";
        jsonData = JsonConvert.SerializeObject(dt, idtc).ToString();

        context.Response.Write(jsonData);
    }

 2、jqGrid以loadonce=false的方式获取数据,从服务器分页加载数据,每次分页器里面操作后会请求服务器数据,客户端分页参数自动附加到回传到服务端的请求参数里面

数据格式见下面jsonReader介绍

客户端

            //请求服务器分页数据
            jQuery("#list").jqGrid(
            {
                url: 'Handler.ashx?action=getVehs_test&areaid=' + $('[id$=hdAreaid]').val(),
                datatype: "json",
                jsonReader: {
                                root: "griddata",
                                total: "totalpages",
                                page: "currpage",
                                records: "totalrecords",
                                repeatitems: false
                            },
                datatype: "json",
                height: 'auto',
                //width: '600',
                autowidth: true,
                colNames: ['车牌号码', '手机号码'],
                colModel: [
                               { name: 'vc_veh', index: 'vc_veh' },
                               { name: 'vc_phone', index: 'vc_veh' }
                           ],

                rowNum: 20,
                rowList: [10, 20, 30],
                sortname: 'vc_veh',
                pager: "#pager",
                viewrecords: true,
                loadonce: true
                //caption: "车辆管理"
            }).navGrid('#pager', { edit: false, add: false, del: false });

服务端

    #region 测试服务器分页返回数据
    /// <summary>
    /// 测试服务器分页返回数据
    /// </summary>
    /// <param name="context"></param>
    void getVehs_test(HttpContext context)
    {
        string jsonData = string.Empty;

        string sPage = HttpContext.Current.Request.Params["page"].ToString();  //当前请求第几页
        int iPage = int.Parse(sPage);
        string sSize = HttpContext.Current.Request.Params["rows"].ToString(); //grid需要显示几行
        int iSize = int.Parse(sSize);
        string sSidx = HttpContext.Current.Request.Params["sidx"].ToString();  //按什么排序
        string sSord = HttpContext.Current.Request.Params["sord"].ToString();  //排序方式('desc'/'asc')

        var area = context.Request.Params["areaid"].ToString() ;
        var ds = DJ.DB.DataHelper.GetFenYeData(area, "bi_transportvehicles", "*", "where int_grouparea ="+area, "order by int_rransportvehicle", sPage, sSize, "");

        IsoDateTimeConverter idtc = new IsoDateTimeConverter();
        idtc.DateTimeFormat = "yyyy-MM-dd hh:mm:ss ffffff";
        jsonData = JsonConvert.SerializeObject(ds.Tables[0], idtc).ToString();

        string returnData = string.Empty;
        returnData = "{";

        //总共多少页
        returnData += "\"totalpages\"";
        returnData += ":";
        returnData += "\"";
        returnData += Math.Ceiling(Convert.ToDecimal(ds.DataSetName) / Convert.ToInt32(sSize));
        returnData += "\"";
        returnData += ",";

        //当前第几页
        returnData += "\"currpage\"";
        returnData += ":";
        returnData += "\"";
        returnData += sPage;
        returnData += "\"";
        returnData += ",";

        //总共多少记录
        returnData += "\"totalrecords\"";
        returnData += ":";
        returnData += "\"";
        returnData += ds.DataSetName;
        returnData += "\"";
        returnData += ",";

        //datable转换得到的JSON字符串
        returnData += "\"griddata\"";
        returnData += ":";
        returnData += jsonData;

        returnData += "}";
        context.Response.Write(returnData);
    }
    #endregion

3、jsonReader介绍

jqGrid默认的jsonReader如下
jQuery("#gridid").jqGrid({
...
   jsonReader : {
     root: "rows",
     page: "page",
     total: "total",
     records: "records",
     repeatitems: true,
     cell: "cell",
     id: "id",
     userdata: "userdata",
     subgrid: {root:"rows", 
        repeatitems: true, 
       cell:"cell"
     }
   },
...
});

服务端返回数据应对应如下

{ 
  total: "xxx", 
  page: "yyy", 
  records: "zzz",
  rows : [
    {id:"1", cell:["cell11", "cell12", "cell13"]},//cell11等是字段值
    {id:"2", cell:["cell21", "cell22", "cell23"]},
      ...
  ]
}
/**
  * jqGrid默认期望返回的json对象格式要求如下:
  * {"page":"1","total":"2","records":"13",
  * "rows":[
  *                 {id:"1",cell:["1","jancyxue","男","jancyxue@163.com","410958040","江西余干"]},
  *                 {id:"2",cell:["2","linda","女","linda@163.com","111111111","湖南"]},
  *                 {id:"3",cell:["3","jason","男","jason@sina.com","222222222","湖北"]},
  *                 {id:"4",cell:["4","lucy","女","lucy@sina.com","33333333","北京"]}
  *         ]
  * }

jsonReader参数:

root ,这个元素指明表格所需要的数据从哪里开始;

cell ,当前行所包含的单元格数据 ;

id ,行id ;

repeatitems,指明每行的数据是可以重复的,如果设为false,则会从返回的数据中按名字来搜索元素,这个名字就是colModel中的名字。

其他官网demo示例

jQuery("#gridid").jqGrid({
...
   jsonReader : {
      root:"invdata",
      page: "currpage",
      total: "totalpages",
      records: "totalrecords"
   },
...
});
then the data should be {
"totalpages": "xxx", "currpage": "yyy", "totalrecords": "zzz", "invdata" : [ {"id" :"1", "cell" :["cell11", "cell12", "cell13"]}, {"id" :"2", "cell" :["cell21", "cell22", "cell23"]}, ... ] }
jQuery("#gridid").jqGrid({
...
   jsonReader : {
      root:"invdata",
      page: "currpage",
      total: "totalpages",
      records: "totalrecords",
      cell: "invrow"
   },
...
});

The data to match this description would be
{ 
  "totalpages": "xxx", 
  "currpage": "yyy",
  "totalrecords": "zzz",
  "invdata" : [
    {"id" :"1", "invrow" :["cell11", "cell12", "cell13"]},
    {"id" :"2", "invrow" :["cell21", "cell22", "cell23"]},
      ...
  ]
}
jQuery("#gridid").jqGrid({
...
   jsonReader : {
      root:"invdata",
      page: "currpage",
      total: "totalpages",
      records: "totalrecords",
      cell: "invrow",
      id: "invid"
   },
...
});

The data for this description is:
{ 
  "totalpages": "xxx", 
  "currpage": "yyy",
  "totalrecords": "zzz",
  "invdata" : [
    {"invid" :"1", "invrow" :["cell11", "cell12", "cell13"]},
    {"invid" :"2", "invrow" :["cell21", "cell22", "cell23"]},
      ...
  ]
}
jQuery("#gridid").jqGrid({
...
   jsonReader : {
      root:"invdata",
      page: "currpage",
      total: "totalpages",
      records: "totalrecords",
      cell: "",
      id: "0"
   },
...
});

In this case the id is the first element from the row data
{ 
  "totalpages" : "xxx", 
  "currpage" : "yyy",
  "totalrecords" : "zzz",
  "invdata" : [
    ["1", "cell11", "cell12", "cell13"],
    ["2", "cell21", "cell22", "cell23"],
      ...
  ]
}
jQuery("#gridid").jqGrid({
...
   jsonReader : {
      root:"invdata",
      page: "currpage",
      total: "totalpages",
      records: "totalrecords",
      repeatitems: false,
      id: "0"
   },
...
});

The resulting data in our example should be:
{ 
  "totalpages" : "xxx", 
  "currpage" : "yyy",
  "totalrecords" : "zzz",
  "invdata" : [
    {"invid" : "1","invdate":"cell11", "amount" :"cell12", "tax" :"cell13", "total" :"1234", "note" :"somenote"},
    {"invid" : "2","invdate":"cell21", "amount" :"cell22", "tax" :"cell23", "total" :"2345", "note" :"some note"},
      ...
  ]
}

The id element in this case is 'invid'.
A very useful feature here (repeatitems:false) is that there is no need to include all the data that is represented in colModel.Since we make a search by name, the order does not need to match the order in colModel. Hence the following string will be correctly interpreted in jqGrid.
{ 
  "totalpages" : "xxx", 
  "currpage" : "yyy",
  "totalrecords" : "zzz",
  "invdata" : [
    {"invid" :"1", "invdate" : "cell11", "note" :"somenote"},
    {"invid" :"2", "amount" : "cell22", "tax" :"cell23", "total" :"2345"},
      ...
  ]
}
posted on 2013-05-09 18:39  ※WYF※  阅读(3486)  评论(0编辑  收藏  举报