jqGrid和动态列绑定

raj*_*lai 31 jquery jqgrid

如何动态绑定jqGrid?这些列在设计时不可用,但仅在运行时可用.

在当前的jqGrid设计中,需要预先填充colmodel和其他属性,以使网格正常工作.

非常感谢在这个方向上的任何输入.

bru*_*uno 34

在document.ready中试试这个:

$.ajax(
    {
       type: "POST",
       url: "SomeUrl/GetColumnsAndData",
       data: "",
       dataType: "json",
       success: function(result)
       {
            colD = result.colData;
            colN = result.colNames;
            colM = result.colModel;

            jQuery("#list").jqGrid({
                jsonReader : {
                    cell: "",
                    id: "0"
                },
                url: 'SomeUrl/Getdata',
                datatype: 'jsonstring',
                mtype: 'POST',
                datastr : colD,
                colNames:colN,
                colModel :colM,
                pager: jQuery('#pager'),
                rowNum: 5,
                rowList: [5, 10, 20, 50],
                viewrecords: true
            })
       },
       error: function(x, e)
       {
            alert(x.readyState + " "+ x.status +" "+ e.msg);   
       }
    });
setTimeout(function() {$("#list").jqGrid('setGridParam',{datatype:'json'}); },50);
Run Code Online (Sandbox Code Playgroud)

这对我来说很好.

  • 您好Bruno可以分享整个代码,比如如何在后端生成coldata,colName,coleMode. (4认同)
  • 这是一个很酷的技巧,这肯定会工作..这里唯一的问题是你需要有两个发布请求来绑定这个...一个用于获取列和获取网格数据..感谢您的输入.. (2认同)

Mik*_*ill 5

我的解决方案与Teoman Shipahi从2015年8月的出色答案有着相同的想法.

我有一个Web服务,它返回一组JSON数据,但实际列可能会随时间变化.

我想要做的是隐藏我的jqGrid中的一些JSON列,并根据这个特定的JSON字段是否是重要字段之一(在本例中为SegmentName)来设置某些列的宽度.

这是我想出的:

$(function () {
    //  Load the JSON data we'll need to populate our jqGrid

    // ID of a [Segment_Set] record in our database (which our web service will load the data for.
    var SegmentSetId = 12345;

    $.ajax(
    {
        type: "GET",
        url: "/Service1.svc/LoadSegmentAttributes/" + SegmentSetId,
        dataType: "json",
        success: function (JSONdata) {
            // 
            //  Work through our JSON data, and create the two arrays needed by jqGrid 
            //  to display this dynamic data.
            //
            var listOfColumnModels = [];
            var listOfColumnNames = [];

            for (var prop in JSONdata[0]) {
                if (JSONdata[0].hasOwnProperty(prop)) {
                    //  We have found one property (field) in our JSON data.
                    //  Add a column to the list of Columns which we want our jqGrid to display
                    listOfColumnNames.push(prop);

                    //  How do we want this field to be displayed in our jqGrid ?
                    var bHidden = (prop == "SegmentID") || (prop == "SegmentSequenceInx");
                    var columnWidth = (prop == "SegmentName") ? 200 : 50;

                    listOfColumnModels.push({
                        name: prop,
                        width: columnWidth,
                        sortable: true,
                        hidden: bHidden
                    });
                }
            }

            //  Now we have our JSON data, and list of Column Headings and Models, we can create our jqGrid.
            CreateJQGrid(JSONdata, listOfColumnModels, listOfColumnNames);
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

这是创建jqGrid的函数:

function CreateJQGrid(JSONdata, listOfColumnModels, listOfColumnNames) {
    //  After loading the JSON data from our webservice, and establishing the list of 
    //  Column Names & Models, we can call this function to create the jqGrid.
    $("#SegmentRulesGrid").jqGrid({

        datatype: "local",
        data: JSONdata,
        localReader: {
            id: "SegmentID",        //  The Primary Key field in our JSONdata 
            repeatitems: false
        },
        mtype: "GET",
        colNames: listOfColumnNames,
        colModel: listOfColumnModels,
        rowNum: 15,
        loadonce: true,
        gridview: true,
        autowidth: true,
        height: 350,
        pager: '#pager',
        rowList: [15, 30, 100, 300],
        rownumbers: true,
        viewrecords: true,
        caption: 'Segment Rules',
    });
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

显然,我的解决方案的一个缺点是它坚持在将所有 JSON数据显示在网格中之前加载所有 JSON数据,而不是一次只加载一页数据.如果您有大量数据,这可能是一个问题.