函数 getControl("Subgrid").addOnLoad 在首次创建父记录时执行两次

function getControl("Subgrid").addOnLoad execute twice when parent record is first created

你好我做了一个函数来检测我是否在我的子网格中添加或删除了一个新行并根据它执行一些coce

通常它在现有的父记录中工作正常,除非我创建一个新的父记录,我按保存,然后我在我的子网格中添加一行并且我的函数出于某种原因执行两次

有谁知道为什么我的代码只在我创建一个新的父记录时执行两次,这个函数在onLoad even

我从这里获取了原理代码:(dosomething 函数触发了两次)

function onLoad() {

    var funtionName = "onLoad";

    try {

        setTimeout(function () {

            if (Xrm.Page != null && Xrm.Page != undefined && Xrm.Page.getControl("contact_subgrid") != null && Xrm.Page.getControl("contact_subgrid") != undefined) {

                _rowCount = Xrm.Page.getControl("subgrid").getGrid().getTotalRecordCount();

                Xrm.Page.getControl("subgrid").addOnLoad(onGridLoad);

            }

        }, 5000);

    } catch (e) {

        Xrm.Utility.alertDialog(functionName + "Error: " + (e.message || e.description));

    }

}

function onGridLoad() {

    var functionName = " onGridLoad ";

    var currentRowCount = null;

    try {

        setTimeout(function () {

            if (Xrm.Page != null && Xrm.Page != undefined && Xrm.Page.getControl("contact_subgrid") != null && Xrm.Page.getControl("contact_subgrid") != undefined) {

                currentRowCount = Xrm.Page.getControl("subgrid").getGrid().getTotalRecordCount();

                if (currentRowCount > _rowCount) {

                    dosomething();

                    _rowCount = currentRowCount;

                }

                else if (currentRowCount < _rowCount) {

                    dosomethingelse();

                    _rowCount = currentRowCount;

                }

            }

        }, 2000);

    } catch (e) {

        Xrm.Utility.alertDialog(functionName + "Error: " + (e.message || e.description));

    }

}

您的代码使用 Xrm.Page 对象,该对象在 Dynamics 365 CE Online / Dataverse 上已弃用。你应该使用新的 API;参见 Client API Reference - MS Docs

您的函数被调用了两次,因为 onLoad 函数被系统调用了两次:第一次是在“创建”模式下打开表单时,第二次是保存表单上的数据时。保存数据后,不会重新加载表单页面,但会再次调用表单的 onLoad 函数。这会导致您的脚本附加第二个 onLoad 处理程序。

试试这个代码。它基于现代文字 API。确保您的表单将表单上下文传递给 onLoad 函数:

function onLoad(c) {
    const formContext = c.getFormContext();
    const subGrid = formContext.getControl("subgrid");
    const contactSubGrid = formContext.getControl("contact_subgrid");

    if (subGrid === null || contactSubGrid === null)
        return;

    try {
        setTimeout(() => {
            let rowCount = subGrid.getGrid().getTotalRecordCount();

            subGrid.addOnLoad(controlContext => {
                setTimeout(() => {
                    let currentRowCount = subGrid.getGrid().getTotalRecordCount();

                    try {
                        if (currentRowCount > rowCount) {
                            // do something
                        }
                        else if (currentRowCount < rowCount) {
                            // do something else
                        }

                        rowCount = currentRowCount;
                    }
                    catch (e) {
                        Xrm.Navigation.openErrorDialog({ message: e.message, errorCode: e.errorCode });
                    }
                }, 2000);
            });
        }, 5000);
    }
    catch (e) {
        Xrm.Navigation.openErrorDialog({ message: e.message, errorCode: e.errorCode });
    }
}