2

我的数据源使用控制器方法(ASP MVC)抓取行。我需要设置一些东西,这样用户就不能从网格中删除所有行,所以当单击 gris id 中最后一行的删除按钮时,它需要意识到它是最后一行,然后说不。我一直在尝试使用 DataSource.Total() 方法,这是我目前所处的位置:

        $("#location-list").kendoGrid({
            dataSource: ds_locationsList,
            sortable: true,
            height: "150px",
            width: "300px",
            editable: "inline",
            columns: [{
                field: "LocationName", title: "Trespassed Location(s)"
            }, {
                command: [{
                    name: "destroy",
                    text: "Delete",
                    click: function(){
                        var rowCount = ds_locationsList.total();

                        if (rowCount < 1) {
                            $("#dialog").dialog({
                                modal: true,
                                buttons: {
                                    Ok: function () {
                                        $(this).dialog("close");
                                    }
                                }
                            });
                            return false;
                        }
                      }
                    }], 
                    width: "110px"
            }]
        });

这不起作用,我想我需要从销毁函数之外获取 rowCount,也许是在某种“afterLoad”中。我也试过在外面做这一切,但在这两种情况下都没有发生:

        $(".k-grid-delete").on("click", function () {
            var rowCount = ds_locationsList.total();

            if (rowCount < 1) {
                $("#loclistval").removeClass("hidden");
                return false;
            }
        });

有没有人必须这样做?有什么建议么?

=================================编辑================= ======================

如下所述,我尝试了自定义删除功能,但它只从客户端删除。我尝试了调试,但我在删除函数中放置的断点从未被命中,所以我一定是搞砸了调用。这是我的运输代码:

        transport: {
                    read: {
                        url: '@Url.Action("JsonPopulateTrespassList", "TrespassOrder")/' + PersId,
                        dataType: 'json',
                        type: "POST"
                    },
                destroy: {
                        url: '@Url.Action("JsonDeleteLocation", "TrespassOrder")',
                        dataType: 'json',
                        type: "POST"
                    }
        },

和我的参数图:

         parameterMap: function (options, operation) {
             if (operation == "destroy" && options.models) {
                 var values = {};
                 values["TrespassLocId"] = options.models[0].TrespassLocId;
                 return values;
             }
         },

自定义删除:

function locDelete(e) {
    var len = this.dataSource.data().length;

    if (len === 1) {
        alert("There must be at least one location.");
    }
    else {
        this.removeRow($(e.target).closest("tr"));
    }
}

和网格代码:

       $("#trespassed-location-list").kendoGrid({
            dataSource: ds_locationsList,
            sortable: true,
            height: "150px",
            width: "300px",
            editable: "incell",
            columns: [{
                field: "LocationName", title: "Trespassed Location(s)"
            }, {
                command: [{ name: "destroy", text: "Delete", click: locDelete }],
                width: "110px",
            }] 
       });

所以它从客户端删除了行,而不是服务器端。但是当我尝试调试时,locDelete 函数上的断点永远不会被命中,所以我确定发生了什么。

4

1 回答 1

3

问题是删除事件是在删除行时触发的,而停止它为时已晚。

因此,最简单的方法是定义一个执行验证的自定义命令。

将网格命令定义为:

columns   : [
    {
        command: [
            ...,
            { name: "Remove", click: obDelete }
        ],
        ...
    },
    ...
]

然后定义obDelete为:

function obDelete(e) {
    var len = this.dataSource.data().length;
    if (len === 1) {
        alert("last");
    } else {
        this.removeRow($(e.target).closest("tr"));
    }
}

此处运行示例:http: //jsfiddle.net/OnaBai/bxxqC/

于 2013-07-26T18:52:27.290 回答