如果关闭了模态弹出窗口而没有取消在模态内的网格视图中的行编辑,则它不会再次打开

Modal PopUp won't open again if it is closed without canceling row editing in a gridview placed within the modal

本文关键字:模态 编辑 视图 网格 窗口 如果 取消      更新时间:2023-09-26

我有一个gridview就地编辑。这个gridview被放置在一个模态弹出扩展器中。一切都很好,但如果我编辑一行和输入不符合验证规则的数据 (RegularExpressionValidator)和然后关闭模态弹出,模态将不会再次打开。

我尝试过不同的事情,比如使用jquery来查找取消链接并触发其点击事件,但似乎没有什么工作。最后,我还尝试在javascript函数中取消编辑关闭模态,但问题仍然存在。

下面是我的代码的简化版本:

JS

<script src="script/jquery-1.10.2.min.js" type="text/javascript"></script>
    <script language="javascript" type="text/javascript">
        function CerrarPopup(strMpeCliente) {
            // Find the Generated Cancel Button for the Row in Edit Mode.
            var cancelButton = $('#<%= GridView2.ClientID %>')
                               .find('a')
                               .filter(function() { return $(this).text() === "Cancelar" });
            // If Cancel Button is found, then show message and click the Cancel Button.
            if (cancelButton != null && cancelButton.length > 0) {
                buttonClick(cancelButton[0]);
            }
            var modalPopupBehavior = $find(strMpeCliente);
            modalPopupBehavior.hide();
        }
        function buttonClick(button) {
            button.click();
        }    
    </script>
ASP

<cc1:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server">
</cc1:ToolkitScriptManager>
<asp:UpdatePanel ID="upnlPagos" UpdateMode="Conditional" runat="server">
    <ContentTemplate>
        <asp:GridView ID="GridView1" HeaderStyle-BackColor="#3AC0F2" HeaderStyle-ForeColor="White"
            runat="server" AutoGenerateColumns="false">
            <Columns>
                <asp:BoundField DataField="Id" HeaderText="Id" ItemStyle-Width="30" />
                <asp:BoundField DataField="Name" HeaderText="Name" ItemStyle-Width="150" />
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:ImageButton ID="btnViewDetails" CommandArgument='<%# Eval("Id") %>'
                            OnClick="View" runat="server" />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
        <asp:LinkButton Text="" ID="lnkFake" runat="server" />
        <cc1:ModalPopupExtender ID="mpe" runat="server" PopupControlID="pnlPopup" TargetControlID="lnkFake"
            CancelControlID="btnClose" BackgroundCssClass="modalBackground" BehaviorID="mpeDetalles">
        </cc1:ModalPopupExtender>
        <asp:Panel ID="pnlPopup" runat="server" CssClass="modalPopup" Style="display: none">
            <div class="header">
                Details <a class="dvCerrar" href="javascript:;" onclick="CerrarPopup('mpeDetalles');"
                    title="Cerrar">&nbsp;&nbsp;X&nbsp;&nbsp; </a>
            </div>
            <div class="body">
                <asp:GridView ID="GridView2" HeaderStyle-BackColor="#3AC0F2" HeaderStyle-ForeColor="White"
                    runat="server" AutoGenerateColumns="false" OnRowEditing="gvPrueba_RowEditing"
                    OnRowUpdating="gvPrueba_RowUpdating" OnRowCancelingEdit="gvPrueba_RowCancelingEdit">
                    <Columns>
                        <asp:BoundField DataField="Id" HeaderText="Id" ItemStyle-Width="30" />
                        <asp:BoundField DataField="Name" HeaderText="Name" ItemStyle-Width="150" />
                        <asp:TemplateField>
                            <ItemTemplate>
                                <asp:Label ID="lblCorreo" runat="server" Text='<%# Eval("Email")%>'></asp:Label>
                            </ItemTemplate>
                            <EditItemTemplate>
                                <asp:TextBox ID="txtCorreo" runat="server" Text='<%# Eval("Email")%>' MaxLength="70"
                                    Width="180px"></asp:TextBox>
                                <asp:RegularExpressionValidator ID="revtxtCorreo" runat="server" ControlToValidate="txtCorreo"
                                    ErrorMessage="" ValidationExpression="^'s*(['w'.'-]+)@(['w'-]+)(('.('w){2,3})+)'s*$"
                                    Display="Dynamic" ForeColor="Red" ToolTip="Formato de correo incorrecto">*</asp:RegularExpressionValidator>
                            </EditItemTemplate>
                        </asp:TemplateField>
                        <asp:CommandField HeaderText="Editar" ButtonType="Link" ShowEditButton="true" ShowCancelButton="true"
                            CancelText="Cancelar" EditText="Editar" UpdateText="Guardar"></asp:CommandField>
                    </Columns>
                </asp:GridView>
            </div>
            <div class="footer" align="right">
                <asp:Button ID="btnClose" runat="server" Text="Close" CssClass="button" 
                    onclick="btnClose_Click" />
            </div>
        </asp:Panel>
    </ContentTemplate>
</asp:UpdatePanel>
CS

 protected void Page_Load(object sender, EventArgs e)
        {
            if (!this.IsPostBack)
            {
                DataTable dt = new DataTable();
                dt.Columns.AddRange(new DataColumn[5] { new DataColumn("Id", typeof(int)),
                        new DataColumn("Name", typeof(string)),
                        new DataColumn("Country",typeof(string)),
            new DataColumn("City",typeof(string)),
            new DataColumn("Phone",typeof(int))});
                dt.Rows.Add(1, "John Hammond", "United States", "Lasvagas", 1234567899);
                dt.Rows.Add(2, "Mudassar Khan", "India", "Mumbai", 1234567899);
                dt.Rows.Add(3, "Suzanne Mathews", "France", "Paris", 1234567899);
                dt.Rows.Add(4, "Robert Schidner", "Russia", "Mascow", 1234567899);
                GridView1.DataSource = dt;
                GridView1.DataBind();
                ViewState["Table"] = dt;


                //DETALLE
                DataTable dtDetalle = new DataTable();
                dtDetalle.Columns.AddRange(new DataColumn[3] { new DataColumn("Id", typeof(int)),
                        new DataColumn("Name", typeof(string)),
                        new DataColumn("Email",typeof(string))});          
                dtDetalle.Rows.Add(1, "John Hammond", "jj@siempresof.tom");
                dtDetalle.Rows.Add(2, "Mudassar Khan", "aj@siempresof.tom");
                dtDetalle.Rows.Add(3, "Suzanne Mathews", "eej@siempresof.tom");
                dtDetalle.Rows.Add(4, "Robert Schidner", "tttj@siempresof.tom");
                ViewState["tbDetalle"] = dtDetalle;
            }
        }
        protected void gvPrueba_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {
            GridView2.EditIndex = -1;
            FillGrid();

        }
        protected void gvPrueba_RowEditing(object sender, GridViewEditEventArgs e)
        {
            GridView2.EditIndex = e.NewEditIndex;
            FillGrid();
        }
        protected void gvPrueba_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {   
            GridView2.EditIndex = -1;
        }
        protected void View(object sender, EventArgs e)
        {
            FillGrid();
        }
        private void FillGrid()
        {
            DataTable dt = (DataTable)ViewState["tbDetalle"];            
            GridView2.DataSource = dt;
            GridView2.DataBind();
            mpe.Show();
        }    
        protected void btnClose_Click(object sender, EventArgs e)
        {
            GridView2.EditIndex = -1;
            mpe.Hide();
        }

一如既往,任何帮助都将不胜感激

提前感谢。

注:这里是我的简化版的完整源代码链接。

隐藏或显示模态弹出扩展器仍然保持模态弹出在内存中(在页面中),所以验证仍然阻塞回发(当你试图正常保存或取消时会发生什么),除非你通过Javascript关闭它(我认为)。

所以我认为为什么弹出不再打开的原因是因为在后台的验证仍然是失败的模态,因此不允许再次显示自己。

你试过在取消按钮上使用CausesValidation=false吗?

问好。