在 PHP 中刷新 Jqgrid

Posted

技术标签:

【中文标题】在 PHP 中刷新 Jqgrid【英文标题】:Refresh Jqgrid in PHP 【发布时间】:2022-01-12 09:37:59 【问题描述】:

我有 jqgrid 需要刷新数据 onchange 事件,我用 js 创建表并像这样制作 jqgrid 的对象:

$('<table id="list2"></table>' +
    '<div id="gridpager"></div>').appendTo('#topics');
grid = jQuery("#list2");

在此之后,我有一个 ajax 函数来从数据库中获取数据,并将 jqgrid 放在成功方法上。这是代码。

function getReport(start_date,end_date) 
    $.ajax(
        url: "logics/inventory_reports",
        type: "POST",
        data: 
            type: "getTrailBalance_report",
            start_date: start_date,
            end_date: end_date,
        ,
        success: function (data) 
            let dt = JSON.parse(data);
            debugger;
            grid.jqGrid(
                datastr: dt.records,
                datatype: "jsonstring",
                height: "auto",
                loadui: "disable",
                pgbuttons : false,
                pginput : false,
                colNames: [/*"id",*/"Items","Debit", "Credit"],
                colModel: [
                    //name: "id",width:1, hidden:true, key:true,
                    name: "name", width:250, resizable: false,sortable: false,
                    name: "debit",width:150,sortable: false,
                    name: "credit",width:150,sortable: false
                ],
                treeGrid: true,
                pager : '#gridpager',
                caption: "Trail Balance Report",
                ExpandColumn: "elementName",
                autowidth: true,

                rowNum: 10000,
                jsonReader: 
                    root: "response"
                
            ).navGrid('#gridpager',
                view:true,
                del:false,
                search: false,
                autoRefresh: true,
            );
            jQuery("#list2").trigger("reloadGrid");

        
    );

这是我的下拉 onchange 事件。

<select name="time_period" id="time_period" class="form-control" onchange="getTimePeriod()">
                        <option value="0">--Select Time Period--</option>
                        <option value="cDay">Current Day</option>
                        <option value="lDay">Last Day</option>
                        <option value="cWeek">Current Week</option>
                        <option value="lWeek">Last Week</option>
                        <option value="cMonth">Current Month</option>
                        <option value="lMonth">Last Month</option>
                        <option value="cYear">Current Year</option>
                        <option value="lYear">Last Year</option>
                    </select>

这里是 getTimePeriod() 方法的代码,我从这里调用带有传递参数的 getReport 方法。

函数getTimePeriod()

    let timePeriod = $("#time_period").val();
    let periodDate = new Date();
    let date = new Date(), y = date.getFullYear(), m = date.getMonth();
    let message = "";
    let FYear;
    let start_date = new Date();
    debugger;
    switch (timePeriod) 

        case 'cDay':
            periodDate = new Date();
            message = 'Current Day';
            break;

        case 'lDay':
            //periodDate = new Date;
            start_date.setDate(start_date.getDate() - 1);
            periodDate.setDate(periodDate.getDate() - 1);
            // periodDate = periodDate.toISOString().slice(0, 10);
            message = 'Last Day';
            break;

        case 'cWeek':
            //periodDate = new Date;
            start_date.setDate(start_date.getDate() - (start_date.getDay() + 6) % 7); // Starting date of week
            periodDate.setDate(periodDate.getDate() - (periodDate.getDay() - 7) % 7); // Ending date of Week
            message = 'Current Week';
            break;

        case 'lWeek':
            start_date.setDate(start_date.getDate() - (start_date.getDay() + 6) % 7);// Starting date.
            start_date.setDate(start_date.getDate() - 7);
            periodDate.setDate(periodDate.getDate() - (periodDate.getDay() -  7) % 7); // Ending date.
            periodDate.setDate(periodDate.getDate() - 7);
            message = 'Last Week';
            break;

        case 'cMonth':
            start_date = new Date(y, m, 1); // Starting date of this month.
            periodDate = new Date(y, m + 1, 0); // Ending date of this month.
            message = 'Current Month';
            break;

        case 'lMonth':
            start_date = new Date(y, m - 1, 1); // Starting date of the previous Month.
            periodDate = new Date(y, m, 0); // Ending date of the previous Month.
            message = 'Last Month';
            break;

        case 'cYear':
            FYear = getFinancialYearsLastMonth();
            start_date = new Date(y, FYear, 1); // Starting date of this Financial Year.
            periodDate = new Date(y +1, FYear, 0); /*#### second value tells the month number ######*/ // Ending Date.
            message = 'Current Year';
            break;

        case 'lYear':
            FYear = getFinancialYearsLastMonth();
            start_date = new Date(y - 1, FYear, 1); // Starting date of previous Financial Year.
            periodDate = new Date(y, FYear, 0); /*#### second value tells the month number ######*/ // Ending Date
            message = 'Last Year';
            break;

    

    // periodDate = periodDate.toISOString().slice(0, 10);
    document.getElementById("showDate").innerhtml = getDateInFormat(periodDate);
    getReport(ReFormateDate(start_date),ReFormateDate(periodDate));


避免getTimePeriod方法中的其余代码,只看getReport的调用。

我放置调试器并测试每次更新数据但 jqgrid 不刷新数据。我试过但喜欢 jQuery("#list2").trigger("reloadGrid");和 .navGrid('#gridpager', 观点:真实, 德尔:假, 搜索:假, 自动刷新:真, );但没有影响。你能帮我解决这个问题吗? 谢谢!

【问题讨论】:

【参考方案1】:

在您的实现中,您每次更改时都会调用 jqGrid(您的函数 getReport) - 不更新网格的原因是它已经创建。

当创建网格实例时,对它的任何调用都不会执行任何操作。 我看到了两个简单的解决方案

    在您的情况下,您可以在创建网格之前简单地销毁网格 - 根据使用的 jqGrid 版本检查文档 - Guriddo jqGrid 或 free-jqGrid。 - 然后调用 jqGrid 实例。

    当您第一次创建网格时,标记它已创建,并在您的成功函数中第一次调用后执行(这只是未经测试的代码)

success: function (data) 
    let dt = JSON.parse(data);
    if (grid_is_created) 
        grid.jqGrid('setGridParam', data: dt.records).trigger("reloadGrid");
     else 
        grid.jqGrid(...);
        grid_is_created= true;
    

【讨论】:

我尝试了第一个解决方案,当我把 grid.jqGrid("GridUnload");方法它第一次完美加载,但第二次删除网格 对于第二个解决方案,它的发生与我在问题中所说的相同。它是第一次加载,但在更改时不会更改记录。 您能告诉我您是如何实现第一个选项的吗?我建议您将 gridUnload 放在 ajax 调用之前,而不是在成功函数中。看来您使用的是 free-jqGrid,因为 Guriddo 中 gridUnload 的调用完全不同。在之前的版本中这个方法有问题,所以我建议你把它放在 ajax 之前,最好切换到支持的 Guriddo jqGrid。 free-jqGrid 3 年就死了。 在 ajax 之前调用 gridUnload 时同样的问题。 使用哪个版本的jqGrid?

以上是关于在 PHP 中刷新 Jqgrid的主要内容,如果未能解决你的问题,请参考以下文章

Jqgrid学习

在 PHP 中刷新 Jqgrid

如何在php页面中刷新iframe [重复]

从包含的 .php 文件中自动刷新表

如何在php中停止刷新页面[重复]

刷新给出空白页php [重复]