【问题标题】:highlight error cell or input when validation fails in jqgrid在 jqgrid 中验证失败时突出显示错误单元格或输入
【发布时间】:2011-08-24 17:32:00
【问题描述】:

我正在使用 jqgrid 内联编辑并使用编辑规则在网格中进行验证。我想为验证失败的输入添加类以突出显示错误(例如:ui-state-error)。 我可以使用此设置类以突出显示错误

jQuery('#'+grid_id).jqGrid('setCell',row_id,errfields[a],'','ui-state-error',{color: 'blue'});我>

但是当内置验证失败时,它在 jqgrid 中不起作用。 如何突出显示验证错误触发的单元格/输入。

【问题讨论】:

    标签: jqgrid


    【解决方案1】:

    The demo 显示了如何解决问题:

    在演示中,“金额”、“税收”和“总计”列将使用以下验证规则进行验证:

    editrules:{required:true,number:true}
    

    在出现任何验证错误时,将添加验证失败的第一个输入字段以及其他类“ui-state-error”。它是标准的 jQuery UI CSS 类。此外,我将焦点设置到输入字段。

    对于实现,我覆盖(链)方法$.jgrid.checkValues$.jgrid.hideModal 的默认实现。下面是对应的代码:

    var grid = $("#list");
    grid.jqGrid({
        // define all jqGrid options
    });
    
    var originalCheckValues = $.jgrid.checkValues,
        originalHideModal = $.jgrid.hideModal,
        iColWithError = 0;
    $.jgrid.checkValues = function(val, valref,g, customobject, nam) {
        var tr,td,
            ret = originalCheckValues.call(this,val, valref,g, customobject, nam);
        if (!ret[0]) {
            tr = g.rows.namedItem(editingRowId);
            if (tr) {
                $(tr).children('td').children('input.editable[type="text"]').removeClass("ui-state-error");
                iColWithError = valref; // save to set later the focus
                //error_td_input_selector = 'tr#'+editingRowId+' > td:nth-child('+(valref+1)+') > input.editable[type="text"]:first';
                td = tr.cells[valref];
                if (td) {
                    $(td).find('input.editable[type="text"]').addClass("ui-state-error");
                }
            }
        }
        return ret;
    };
    $.jgrid.hideModal = function (selector,o) {
        var input, oldOnClose, td,
            tr = grid[0].rows.namedItem(editingRowId);
        if (tr) {
            td = tr.cells[iColWithError];
            if (td) {
                input = $(td).children('input.editable[type="text"]:first');
                if (input.length > 0) {
                    oldOnClose = o.onClose;
                    o.onClose = function(s) {
                        if ($.isFunction(oldOnClose)) {
                            oldOnClose.call(s);
                        }
                        setTimeout(function(){
                            input.focus();
                        },100);
                    };
                }
            }
        }
        originalHideModal.call(this,selector,o);
    };
    

    【讨论】:

    • 非常感谢。答案很有帮助。如果我在一个页面中有两个以上的可编辑网格,我是否需要在每个网格中重复 '$.jgrid.checkValues' 和 '$.jgrid.hideModal' 函数。
    • @Shermi:$$.jgrid 是属于window 对象的全局对象。所以$.jgrid.checkValues$.jgrid.hideModal的全称是window.$.jgrid.checkValueswindow.$.jgrid.hideModal。换句话说,函数checkValueshideModal 不属于网格的实例,因此应该仅重新实现一次
    • @Oleg:当使用上面的代码覆盖 checkValues 方法时,我在 Firefox 控制台上收到“递归过多”错误,此行 ret = originalCheckValues.call(this,val, valref,g,自定义对象,名称);
    • 我发布的 @RRK: The demo 没有描述的问题。所以我想你的代码有问题。例如,您插入了我多次建议的代码。
    • @Oleg:谢谢。我在 document.ready(); 之外插入了上面的代码。方法和因此的错误。将代码放入 ready() 方法后,我不再收到递归错误。除了突出显示单元格外,我还能够在单元格上添加 qtip 错误消息。我现在想禁用带有 jqgrid 显示的错误消息的弹出对话框。有什么想法吗?
    【解决方案2】:

    在我的项目中,我结合使用 jqgrid 和jquery validation plugin 来检查和突出显示错误,以在整个应用程序中提供统一的外观。您可以使用rowId_columnName 作为 id 来查找编辑器(输入、选择等),例如$('#1_name') 用于第 1 行中的名称列,然后使用 jquery 对象添加规则,例如$('#1_name').rules('add', {required:true}) 添加一个规则以强制该单元格是必需的,然后调用 $('#1_name').valid() 在提交值时强制验证通过,例如在调用 jqgrid saveRow 方法之前。打开插件链接,了解更多规则方法和有效方法。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-18
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    相关资源
    最近更新 更多