禁用一个UpdatePanel的UpdateProgress

时间:2017-04-11 02:23:04

标签: asp.net webforms

我正在对具有许多UpdatePanel和UpdateProgress控件的ASP.NET Web窗体应用程序进行一些更改。

我添加了一个UpdatePanel,仅针对此UpdatePanel,我希望在此UpdatePanel更新时停止显示所有UpdateProgress。

许多UpdateProgress控件没有设置AssociatedUpdatePanelID,因此在我更新新的UpdatePanel时会显示它们。

有没有办法排除UpdatePanel触发没有设置AssociatedUpdatePanelID的UpdateProgress?可能是一些JavaScript?

我在这里找到了一些解决方案,但它们要求您知道UpdateProgress的ID。在整个应用程序中有很多UpdateProgress,我不想指定每个。

1 个答案:

答案 0 :(得分:0)

好的,所以没有答案我进一步调查并提出客户端解决方案。

如果UpdateProgress控件没有关联的UpdatePanel,并且触发部分回发的UpdatePanel至少有一个与之关联的UpdateProgress,则此脚本将禁止显示它们。

长话短说:如果UpdatePanel有一个关联的UpdateProgress控件,那么只有它们会在触发部分回发时显示。

<script type="text/javascript">

    //array of original values
    var updateProgressDefaults = [];

    Sys.Application.add_init(appl_init);

    function appl_init() {

        var c = Sys.Application.getComponents();
        for (var i = 0; i < c.length; i++) {
            if (Object.getType(c[i]).getName() == "Sys.UI._UpdateProgress" && !c[i]._associatedUpdatePanelId) {
                updateProgressDefaults[c[i].get_id()] = c[i]._associatedUpdatePanelId;
            };
        }

        var pgRegMgr = Sys.WebForms.PageRequestManager.getInstance();
        pgRegMgr.add_initializeRequest(BeginHandler);
        pgRegMgr.add_endRequest(EndHandler);
    }

    function BeginHandler(sender, args) {
        //There is no _updatePanelsToUpdate if a trigger is outside of an UpdatePanel
        if (!args._updatePanelsToUpdate) return;

        //Check if the affected UpdatePanel has an associated UpdateProgress control
        var hasUpdateProgress = false;

        var c = Sys.Application.getComponents();
        for (var i = 0; i < args._updatePanelsToUpdate.length; i++) {
            for (var j = 0; j < c.length; j++) {
                if (Object.getType(c[j]).getName() == "Sys.UI._UpdateProgress" && args._updatePanelsToUpdate[i].replace(/\$/g, "_") == c[j]._associatedUpdatePanelId) {
                    hasUpdateProgress = true;
                    break;
                }
            }

            if (hasUpdateProgress) break;
        }

        //If the UpdatePanel has an associated UpdateProgress control then set all the UpdateProgress controls without associated UpdatePanels to a non-existant UpdatePanel
        if (hasUpdateProgress) {
            for (var i = 0; i < c.length; i++) {
                var id = c[i].get_id();
                var type = Object.getType(c[i]).getName();
                if (type == "Sys.UI._UpdateProgress" && !c[i]._associatedUpdatePanelId) {
                    c[i]._associatedUpdatePanelId = "NullUpdateProgress";
                };

            }
        }
    }

    //Restores AssociatedUpdatePanelId for all UpdateProgress controls
    function EndHandler() {
        for (var key in updateProgressDefaults) {
            $get(key).control._associatedUpdatePanelId = updateProgressDefaults[key];
        }
    }
</script>

来源:Disable common UpdateProgress controls for an UpdatePanel with an associated UpdateProgress