jqGrid编辑自定义功能

时间:2016-02-29 12:35:52

标签: javascript jquery jqgrid

我在可编辑单元格上进行数据验证时遇到问题。我根据这些单元格的值使一列的单元格可编辑。这是网格的代码:

jQuery("#cart").jqGrid({
    datatype: 'local',
    autowidth: true,
    height: tabHeight,
    gridview: true,
    shrinkToFit: true,
    autoencode: true,
    loadtext: "იტვირთება",
    multiselect: true,
    idPrefix:"b",
    colNames: ['დასახელება', 'რაოდენობა მინ.', 'რაოდენობა მაქს.', 'პოზიცია', 'რაოდენობა', 'ფასი'],
    colModel: [{
        name: 'asktx',
        index: 'asktx',
        width: 40,
        sorttype: "string",
    },
    {
        name: 'menge_min',
        index: 'menge_min',
        width: 30,
        sorttype: "number",
        hidden: true
    },
    {
        name: 'menge_max',
        index: 'menge_max',
        width: 30,
        sorttype: "number",
        hidden: true
    },
    {
        name: 'srvpos',
        index: 'svrpos',
        hidden: true
    },
    {
        name: 'menge',
        index: 'menge',
        width: 30,
        sorttype: "number",
        editrules: {
            required: true, number: true, custom: true, custom_func: checkInterval
        },
        editable: true,
    },
    {
        name: 'price',
        index: 'price',
        width: 30,
        sorttype: "string",
        search: false,
    }],
    viewrecords: true,
    caption: "არჩეული მომსახურებები",
    gridComplete: function () {
        var $this = $(this), ids = $this.jqGrid('getDataIDs'), i, l = ids.length;
        for (i = 0; i < l; i++) {
            var rowData = jQuery(this).getRowData(ids[i]);
            if (rowData.menge_min != rowData.menge_max && !rowData.menge) {
                menge_min = rowData.menge_min;
                menge_max = rowData.menge_max;
                $this.jqGrid('editRow', ids[i], true);
            }
        }
    }
});

我正在使用gridComplete检查两个单元格的值是否相等,如果不相等,我在该行中创建一个名为"menge"的列。我还对常量值进行了验证,比如我需要检查这个menge值是否介于a和b之间,我可以做到这一点,一切都很好,尽管现在我需要根据{的值验证该字段值隐藏了{1}}和"menge_min"字段值。我看到自定义函数"menge_max"只能有两个参数,所以我无法在那里传递行ID。有没有办法获取有关当前正在自定义验证功能中编辑的行的某些信息?

我根据另一个网格上的点击事件填充网格,这是现在的验证功能:

"checkInterval"

对于多个可编辑的行,它是一种要求,如果没有弹出验证错误并且继续编辑其他行,则用户知道他/她输入了正确的值。 jqGrid版本是4.5.1。

这是另一个网格的select事件:

var checkInterval = function (value, colname) {
            value = parseInt(value);
            mange_min = parseInt(menge_min);
            menge_max = parseInt(menge_max);

            if (value < menge_min || value > menge_max) {
                return [false, "რაოდენობა უნდა იყოს " + menge_min + "-" + menge_max + " ინტერვალში"];
            } else {
                return [true];
            }
        }

1 个答案:

答案 0 :(得分:0)

我发现您的问题是访问menge_max回调中menge_min列内的custom_func内容。

您当前的代码集menge_minmenge_max网格的最后一行中的值。 gridComplete内的循环覆盖了变量的值。

我建议您不要为多行开始编辑模式。它会产生许多问题。例如,可以修改行,但不保存。排序和过滤(搜索)在网格中被阻止。只有在保存所有行的更改后才可以使用这种可能性。通常,一个工具在点击网格的任何单元格时开始编辑。用户看到编辑开始,他/她可以按 Enter 保存数据。在编辑行之间,用户可以对网格进行排序或过滤(您可以添加filterToolbar方法的调用来创建过滤条)。用户可以轻松找到所请求的数据行,然后编辑数据。

您目前使用的版本4.5.1非常陈旧。它发表于大约3年前。您没有可以使用异常custom_func的回调,因为您可以同时编辑多行

解决问题的最简单方法是更新到免费的jqGrid 4.13.0。 Free jqGrid是我从2014年底开始开发的jqGrid的分支。它具有您需要的魅力。我实现了替代方式来指定自定义验证。可以使用custom: true, custom_func: checkInterval来代替使用custom: checkInterval而不是custom属性不是布尔值,而是使用回调函数。如果custom回调将获得一个参数options,其中包含许多可以使用的属性。属性描述为here(有关其他信息,请参阅the comment)。您可能需要options.rowid并使用var item = $(this).jqGrid("getLocalRow", options.rowid);来获取完整的数据项,其中item.menge_maxitem.menge_min可以使用。

此外,我建议您在onSelectRow或父网格中使用addRow。您可以使用initdata选项指定网格数据,而不是rowIDaddRow的文档错误地描述了rowID的默认值。 rowID的默认值为null,即使是版本4.5.1(请参阅the line代码),jqGrid 会自动生成唯一的rowid 。然后,您可以从gridComplete中删除代码。如果您要在选择网格中的行时启动内联编辑,那么用户可以不受任何限制地完成所需的所有操作。

最后一句话。如果您要迁移到免费的jqGrid,则可以从网格中删除menge_minmenge_maxsvrpos列。而不是你可以使用additionalProperties: ["menge_min", "menge_max", "svrpos"]。它通知自由jqGrid 保存本地数据中属性的值,但不将信息放在网格的某些隐藏单元格中(页面的DOM中没有不需要的信息)。

您可以通过sorttype: "string"删除不需要的indexcolModel媒体资源。