我有文本框和一个按钮。
该按钮使用由文本框 textchanged 事件操作的值。
我不希望在文本框更改事件更改值之前触发按钮单击事件。
void tprice_TextChanged(object sender, EventArgs e) {
idtextbox tsender = (idtextbox)sender;
decimal value = 0;
decimal.TryParse(tsender.Text, out value);
if (area_updates.ContainsKey(tsender.id)) { area_updates[tsender.id].price = value; }
else { area_updates.Add(tsender.id, new area_update(tsender.id) { price = value }); }
Session["area_updates"] = area_updates;
}
protected void bsave_Click(object sender, EventArgs e) {
}
Afaik 没有办法确保事件顺序TextChanged
-> ButtonClick
。您应该使用不同的方法。
- 将
TextChanged
逻辑移动到ButtonClick
事件中或 - 进行
TextBox
AutoPostBack=true
,但这需要额外的回发
所以我建议将逻辑放入ButtonClick
- 并删除TextChanged
事件。
编辑:根据您所做的另一条评论,如果以编程方式添加和删除文本框,您还可以使用按钮和文本框创建自定义用户控件,并实现此逻辑,然后以编程方式添加该用户控件。因此,一个按钮和文本框将相互关联,而不知道其他按钮和文本框。我不确定您要执行此操作的上下文,因此此方法可能不是最好的。
使用 textboxIsDirty 标志,该标志在两个事件处理程序中设置和取消设置。
private bool tpriceIsDirty = false;
void tprice_TextChanged(object sender, EventArgs e) {
tpriceIsDirty = true;
// Do work
}
protected void bsave_Click(object sender, EventArgs e) {
if (tpriceIsDirty)
{
tpriceIsDirty = false;
// Do work
}
}
正如另一个答案中所建议的,我还将在 Click 方法中执行您在 TextChanged 方法中的当前逻辑。但是,您可以将 tpriceIsDirty 标志绑定到 bsave。启用属性,用于在文本框保持不变时完全禁用按钮。从用户体验的角度来看,它更好。:)
编辑:根据您所做的评论,您还可以动态添加和删除事件处理程序。这种方法的变体可能对您有益。
void tprice_TextChanged(object sender, EventArgs e) {
if (bsave.Click == null)
{
bsave.Click += bsave_Click;
}
....
}
protected void bsave_Click(object sender, EventArgs e) {
bsave.Click = null;
}
是的,这是可能的...只需看看下面的解决方案..它基本上是a trick created using javascript
但足够强大..
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script>
function EnsureNoSubmit(txt) {
//alert('Ensured no submit');//test cases
document.getElementById('<%=hdn.ClientID%>').value = false;
}
function isOkToSubmit() {
var needSubmit = document.getElementById('<%=hdn.ClientID%>').value;
//if (needSubmit != '') {alert('No Submit now');}else {alert('Ok with Submit');}//test cases
return needSubmit == '';
}
function MakeSureSubmit() {
//alert('no submit revoked');//test cases
document.getElementById('<%=hdn.ClientID%>').value = '';
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:HiddenField runat="server" ID="hdn" />
<asp:TextBox AutoPostBack="true" runat="server" ID="txt" onchange="EnsureNoSubmit();" OnTextChanged="txt_TextChanged"></asp:TextBox>
<asp:Button Text="Click Me" ID="btnClickMe" OnClientClick="return isOkToSubmit();" OnClick="btnClickMe_Click" runat="server" />
</div>
</form>
</body>
</html>
在后面的代码上只添加一行
protected void txt_TextChanged(object sender, EventArgs e)
{
//Your code is here
Page.ClientScript.RegisterStartupScript(this.GetType(),"Anything","MakeSureSubmit();",true);
}
它会起作用!!
- 启用"保存"按钮的"原因验证"选项。
- 调用焦点编辑器的 DoValidate 方法。
- 调用窗体的 ValidateChildren 方法。
https://msdn.microsoft.com/de-de/library/ms158374(v=vs.110(.aspx