【问题标题】:Checkbox OnClick Event Not Working after partial Pageload (UpdatePanel)部分页面加载后复选框 OnClick 事件不起作用(UpdatePanel)
【发布时间】:2017-05-10 08:46:07
【问题描述】:

我在 ASP.Net 中的 UpdatePanel 中有一个 gridview,在 gridview 中我的每一行都有一个复选框和一个按钮。如果选中该复选框,则该按钮将被启用。如果未选中该复选框,则该按钮将被禁用。在第一页加载 jquery 正常工作,在检查元素中没有错误。但是在我点击了运行数据绑定事件的按钮后,gridview根据需要发生了变化,但是inspect中出现了错误,并且click事件不起作用。

这是我的 aspx 代码

 <%@ Page Title="" Language="C#" MasterPageFile="~/MasterPages/PopUp.Master" AutoEventWireup="true" CodeBehind="abc.aspx.cs" Inherits="HMB.Sbadmin.Web.Pages.T.abc" %>

<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
    <script type="text/javascript">
        $(document).ready(function () {
            chbActionEvent();
        });
        function pageLoad(sender, args) {
            if (args.get_isPartialLoad()) {
                chbActionEvent();
            }
        }

        function chbActionEvent() {
                $('.master_grid span.UnSettled').each(function () {
                    var chbAction = $(this).find('input:checkbox').attr('id');
                    $('#' + chbAction).change(function () {
                        var btnSettle = $(this).closest('tr').find(':submit').attr('id');
                        alert(chbAction + btnSettle);
                        if ($(this).is(':checked')) {
                            $('#' + btnSettle).attr('disabled', false);
                        }
                        else {
                            $('#' + btnSettle).attr('disabled', true);
                        }
                    });
                });
        }
    </script>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <asp:UpdatePanel ID="upMain" runat="server" UpdateMode="Conditional">
        <ContentTemplate>
            <div id="gridContainer">
                <ul class="link_path">
                    <li>
                        <asp:Button ID="btnRefresh" runat="server" Text="Refresh" OnClick="btnRefresh_Clicked" CssClass="uiButton uiButtonConfirm" CausesValidation="false"  />
                    </li>
                </ul>
                <div id="dvMain" runat="server">
                    <asp:gridview ID="gvMain" runat="server" AutoGenerateColumns="False"
                        CssClass="master_grid"
                        HeaderStyle-CssClass="header"
                        OnRowDataBound="gvMain_RowDataBound"
                        OnRowCommand="gvMain_RowCommand">
                        <Columns>
                            <asp:TemplateField HeaderStyle-Width="50px" ItemStyle-HorizontalAlign="Center">
                                <ItemTemplate>
                                    <asp:CheckBox ID="chbAction" runat="server" CausesValidation="false" CssClass="UnSettled"/>
                                </ItemTemplate>
                            </asp:TemplateField>

                            <asp:TemplateField HeaderStyle-Width="120px" ItemStyle-HorizontalAlign="Center">
                                <ItemTemplate>
                                    <asp:Literal ID="ltrSettle" Text='<%# Eval("Settle") %>' runat="server" Visible="false"></asp:Literal>
                                    <asp:Button ID="btnSettle" runat="server" CssClass="UnSettled uiButton uiButtonConfirm" CommandName="cmdSettle" CommandArgument='<%# DataBinder.Eval(Container, "RowIndex") %>' CausesValidation="false" Enabled="false"/><br />
                                </ItemTemplate>
                            </asp:TemplateField>
                        </Columns>
                    </asp:gridview>

                    <div>
                        <asp:Label ID="lblError" runat="server" ForeColor="Red"></asp:Label> 
                    </div>        
                </div>        
            </div>

        </ContentTemplate>
    </asp:UpdatePanel>
</asp:Content>

这是检查元素中的错误:

我也尝试将代码放入 RowDataBound 中: `

protected void gvMain_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            switch (e.Row.RowType)
            {
                case DataControlRowType.Header:
                    setDataBoundHeader(e.Row);
                    break;
                case DataControlRowType.DataRow:
                    if (gvMain.Rows.Count >= 0 && (e.Row.RowState == DataControlRowState.Normal || e.Row.RowState == DataControlRowState.Alternate))
                    {
                        setDataBoundList(e.Row);
                    }
                    break;
            }
        }
protected void setDataBoundList(GridViewRow row)
        {
            CheckBox chbAction = (CheckBox)row.FindControl("chbAction");
            chbAction.Attributes.Add("OnClick", "chbActionEvent()");
        }

`

但是,没有运气。

请帮忙。

更新 1.1:

也试过这个:`

<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
    <script type="text/javascript">
        $(document).ready(function () {
            chbActionEvent();
        });
        //function pageLoad(sender, args) {
        //    if (args.get_isPartialLoad()) {
        //        chbActionEvent();
        //    }
        //}

        function chbActionEvent() {
                $('.master_grid span.UnSettled').each(function () {
                    var chbAction = $(this).find('input:checkbox').attr('id');
                    $('#' + chbAction).change(function () {
                        var btnSettle = $(this).closest('tr').find(':submit').attr('id');
                        alert(btnSettle);
                        if ($(this).is(':checked')) {
                            $('#' + btnSettle).attr('disabled', false);
                        }
                        else {
                            $('#' + btnSettle).attr('disabled', true);
                        }
                    });
                });
        }
    </script>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <script type="text/javascript">
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(chbActionEvent);
    </script>
    <asp:UpdatePanel ID="upMain" runat="server" UpdateMode="Conditional">
        <ContentTemplate>
            <div id="gridContainer">
                <ul class="link_path">

` 但是得到了和第一个代码一样的错误

更新 1.2

尝试使用 Microsoft Visual Studio 进行调试。在第一次尝试时,按钮事件正常工作。但是在部分回发之后(在我第一次单击该按钮之后),该复选框仍然可以正常工作(检查时出错),但是单击该按钮时没有执行任何操作。

更新 1.3

btnSettle 值:

【问题讨论】:

  • 控制台你的 btnSettle 变量..
  • btnSettle 变量总是返回正确的 id,例如:MainContent_gvMain_btnSettle_1

标签: javascript c# jquery asp.net gridview


【解决方案1】:

部分回调后,您必须bind 您的event。最好使用Sys.WebForms.PageRequestManager.getInstance().add_endRequest(InIEvent);

请在您的页面中添加以下代码:

<script type="text/javascript">
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(chbActionEvent);
</script>

更多详情请查看Working with jQuery within the ASP.NET UpdatePanel

【讨论】:

  • 我已经在更新面板之前添加了代码并删除了 document.ready 和 pageload.. 但它不起作用。我应该保留document.ready吗?
  • 在页面第一次加载时,它正在工作,但是在它完成部分加载之后,表格正确加载并且它显示的错误与我的代码不同
  • 未捕获的类型错误:a[b] 不是函数
  • 您可以查看我在回答中提到的文章。它会帮助你。
  • 仍然无法正常工作,并得到与我的第一个代码相同的错误:(
【解决方案2】:

自己找到了解决方案 问题出在 sba.all.js 中,稍微修改了代码,一切正常

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-04
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多