【问题标题】:Using onCheckedChanged with PopupControlExtender and want to prevent popup when unchecking将 onCheckedChanged 与 PopupControlExtender 一起使用,并希望在取消选中时防止弹出
【发布时间】:2012-07-10 08:11:42
【问题描述】:

我对此仍然相当陌生,并试图找到答案,所以希望我不会重复这个。

我正在使用 ASP.NET 并且有一个复选框控件,当它被更改时会弹出一个弹出框,使用 onCheckedChanged 方法。这个弹出框里面有一些信息和一个“关闭”按钮,可以成功关闭弹出框。

我想要的是防止在未选中复选框时出现弹出窗口。我目前有 onCheckedChanged 调用一个代码隐藏方法,如果未检查控件,该方法将取消扩展程序调用,但弹出窗口在关闭之前很快出现。我怎样才能防止这种情况发生?

这是相应的页面代码:

        <div class="row" id="divDDMandate" runat="server">

        <asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Always">
            <ContentTemplate>
                <asp:CheckBox ID="chkDDMandate" Width="20px" Visible="true" runat="server" AutoPostBack="true"
                 OnCheckedChanged="clientchkDDMandateChanged(this);" on  />        
                <asp:Literal ID="ltlDDMandate" runat="server">Direct Debit Mandate (by post)</asp:Literal>

            <asp:PopupControlExtender ID="chkDDMandate_PopupControlExtender" runat="server" 
                DynamicServicePath="" Enabled="true" PopupControlID="PanelDDMandateDownload"
                TargetControlID="chkDDMandate"
                Position="Bottom" OffsetX="-20" OffsetY="10" />
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>

...这是我的方法背后的代码:

        protected void chkDDMandateChanged(object sender, EventArgs e)
    {
        //Cancel the panel if unchecking
        if ((!chkDDMandate.Checked) && chkDDMandate_PopupControlExtender.Enabled)
        {
            chkDDMandate_PopupControlExtender.Cancel();
        }
    }

如果有任何帮助,我将不胜感激。

干杯

【问题讨论】:

    标签: c# asp.net visual-studio asp.net-ajax ajaxcontroltoolkit


    【解决方案1】:

    从 chkDDMandate 复选框中删除 AutoPostBack="true" 并在 ScriptManager 控件之后添加以下脚本:

    <script type="text/javascript">
        function pageLoad() {
            var extender = $find("<%= chkDDMandate_PopupControlExtender.ClientID %>");
            extender.remove_showing(onPopupShowing);
            extender.add_showing(onPopupShowing);
        }
    
        function onPopupShowing(sender, args) {
            var checkBoxChecked = $get("<%= chkDDMandate.ClientID %>").checked;
            args.set_cancel(!checkBoxChecked);
        }
    </script>
    

    【讨论】:

    • 感谢 Yuriy,这让我更接近了!我新它需要一个事件处理程序,但我是 javascript 新手。现在的问题是弹出窗口在下一页刷新之前完全禁用。我选中/取消选中,处理程序第一次运行后没有任何反应..
    • 尝试将焦点移出复选框(即单击页面上的任意位置)。我相信开箱即用的弹出控件会在控件获得焦点时显示弹出窗口。
    【解决方案2】:

    在 Yuriy 为我提供事件处理程序后,我不得不求助于使用隐藏字段来跟踪弹出窗口和复选框的可见性。

    这是因为我不希望在删除勾号时出现弹出窗口,并且 onClick 方法使用复选框控件的设置,而 onShowing 方法使用当前可见设置控制。我必须使用隐藏字段来保留可见性设置并在我想要的时候更新它们。

    我很惊讶弹出扩展器的 _visible 属性总是设置为“false”,所以我也不能使用它。

    这可能有点小技巧,但这是我目前的 javascript 代码,供任何感兴趣的人使用:

        <script type="text/javascript">
    
         function pageLoad() {
         // Attach an event handler for over-riding the showing Popup.
             var extender = $find("PopupControlExtenderBehaviorID");
             extender.remove_showing(onPopupShowing);
             extender.add_showing(onPopupShowing);
    
         // Initialise the hidden fields based on the page status after refresh.
             var hfPopup = $get("ctl00_body_PopupVisibleID");
             var hfCheckbox = $get("ctl00_body_CheckboxChecked");
    
         // Popup will always be hidden on page refresh
             hfPopup.value = "Hidden";
             hfCheckbox.value = $get("ctl00_body_chkDDMandate").checked;
         }  
    
         function onPopupShowing(sender, args) {
            // This function will over-ride the Popup showing if applicable.
             var popupVisible = $get("ctl00_body_PopupVisibleID");
             var checkboxChecked = $get("ctl00_body_CheckboxChecked");
    
            // If Popup hidden and 'tick' being taken out of the Checkbox, don't show the Popup.
             if (popupVisible.value == "Hidden" && checkboxChecked.value == "true") {
                 args.set_cancel(true);
             }
             else if (popupVisible.value == "Hidden") {
                popupVisible.value = "Visible";
                }
                else {popupVisible.value = "Hidden";}
    
         }
    
        function OnClientClickCheck(o) {
            // This function will set the Hidden field value of Checkbox.
            // This is because when the OnClick method reads the control checkbox value it uses the value it's 
            // being set to; whereas, the onPopupShowing method uses the value it is currently displaying!
            var pce = $find('PopupControlExtenderBehaviorID');
            var checkboxChecked = $get("ctl00_body_CheckboxChecked");
            var isChecked = o.checked;
    
            if (isChecked) {
            // isChecked is what it is being changed to...
                checkboxChecked.value = "false";
            }
            else {
                checkboxChecked.value = "true";
            }
            pce.showPopup();
        }
    </script>
    

    感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 2020-12-02
      • 1970-01-01
      • 2017-10-07
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      相关资源
      最近更新 更多