我有一个就地编辑的gridview。此gridview位于模式弹出扩展器中。 一切正常,但是如果我编辑一行而输入的数据不符合验证规则(RegularExpressionValidator)和然后关闭模态弹出,则模式赢了&再次打开。
我尝试了不同的东西,例如using jquery to find the Cancel链接并触发其点击事件,但似乎没有任何效果。 最后我还尝试在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"> X </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();
}
一如既往,任何帮助都将受到极大的赞赏
提前致谢。
P.S。这是我简化版source code的完整链接。
答案 0 :(得分:0)
隐藏或显示模态弹出扩展器仍然在内存中保存模式弹出窗口(在页面中),因此验证仍会阻止回发(当您尝试保存或正常取消时会发生什么),除非您通过Javascript关闭它(我认为)。
所以我认为弹出窗口不再打开的原因是因为在后台验证仍然在模态上失败,因此不允许再次显示它的自我。
您是否尝试在取消按钮上使用CausesValidation=false
?
最好的问候。