我有一个带有下拉列表的gridview,每当在网格下拉列表中进行更改并且用户导航到另一个页面而不单击保存按钮时,我会在下面的JS中显示一个警告。如果用户单击“确定”,则允许您导航到另一个页面,此方案工作正常。
问题部分:
如果用户在显示的提醒中单击“取消”,则不允许导航到其他页面并保留在同一页面中。现在,如果我导航到另一个页面而没有点击保存,则警报不会出现,第二次我无法对取消操作发出警报。
保存按钮:
<asp:Button ID="btnSave" runat="server" OnClick="Save_Click" Text="Save"
CssClass="button" OnClientClick="MySuperDuper.globalChange = false;" />
网格下拉:
<asp:TemplateField HeaderText="Product">
<ItemTemplate>
<asp:DropDownList ID="ddlProduct" runat="server" Enabled="True"
DataTextField="Prod" DataValueField="Prod" OnSelectedIndexChanged="ddlProduct_Change"
onchange="MySuperDuper.globalChange = true;">
</asp:DropDownList>
</asp:TemplateField>
使用Javascript:
<script type="text/javascript">
var MySuperDuper = new function () {
var _this = this;
this.saving;
this.navigateAwayMessage = "You have made some changes which" +
" will be lost if you leave this page. " +
"Do you want to leave this page?";
this.checkForChanges = function () {
if (!_this.saving && typeof (_this.globalChange) !=
"undefined" && _this.globalChange) {
if (document.all && event) {
MySuperDuper.globalChange = false;
event.returnValue = _this.navigateAwayMessage;
}
else {
MySuperDuper.globalChange = false;
return _this.navigateAwayMessage;
}
}
}
}
window.onbeforeunload = function () {
return MySuperDuper.checkForChanges();
}
</script>
答案 0 :(得分:1)
为什么要在点击时将MySuperDuper.globalChange
设置为false
?看来,通过这样做,您可以再次将其设置为true
的唯一方法是更改dropdown
- 将其设置为true
。
您是否尝试过调用以下内容:
<asp:Button ID="btnSave" runat="server" OnClick="Save_Click" Text="Save"
CssClass="button" OnClientClick="return MySuperDuper.checkForChanges()" />
这是要求您的按钮返回方法的结果。如果true
,那么您的按钮将继续正常运行 - 在这种情况下为Save_Click
- 如果false
则不会。
在您的函数中,不是返回消息,而是返回确认框的结果(true
或false
) - 显示方法中的确认框。
要返回确认框的结果,您只需执行以下操作:
return = confirm(this.navigateAwayMessage);
要么是这样,要么只是移除OnClientClick
事件,让你当前的onbeforeunload
方法来处理剩下的事情。
答案 1 :(得分:0)
protected void DropDownList3_SelectedIndexChanged(object sender, EventArgs e)
{
foreach (GridViewRow gvRow in GridView2.Rows)
{
Control ctrl = gvRow.FindControl("ddl_jd");
DropDownList ddl = ctrl as DropDownList;
if (ddl != null)
ddl.SelectedIndex = DropDownList3.SelectedIndex;
}
}
还要确保为DropDownList3设置AutoPostBack =“true”。
另一种方法(不是很干净或简单)是将以下代码添加到Page_Load方法中(并从.aspx文件中删除包含onJDSelection函数的脚本块):
if (!Page.IsPostBack)
{
string functionContent = "<script language=javascript> function onJDSelection()" +
"{ var selectedIndex = document.getElementById('" + DropDownList3.ClientID + "').selectedIndex;" +
"var grid = document.getElementById('" + GridView2.ClientID + "'); " +
"for (var i = 1; i < grid.rows.length; i++) " +
"{ var selObj = grid.rows[i].cells[0].getElementsByTagName(\"*\")[0]; selObj[selectedIndex].selected = true;} "+
"}</script>";
Page.RegisterStartupScript("MyScript", functionContent);
DropDownList3.Attributes.Add("onchange", "onJDSelection()");
}.
请注意,在这种情况下,用于在javascript中检索DropDownList3和GridView2的ID是从代码后面发送的,因为依赖ASP .NET生成的服务器控件ID并不是非常安全。如果您想保存下拉列表值(使用javascript更改),您还需要其他代码。