如何确保在按钮的单击事件之前触发文本框的文本更改事件



我有文本框和一个按钮。

该按钮使用由文本框 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 。您应该使用不同的方法。

  1. TextChanged逻辑移动到 ButtonClick 事件中或
  2. 进行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);
}

它会起作用!!

  1. 启用"保存"按钮的"原因验证"选项。
  2. 调用焦点编辑器的 DoValidate 方法。
  3. 调用窗体的 ValidateChildren 方法。

https://msdn.microsoft.com/de-de/library/ms158374(v=vs.110(.aspx

相关内容

  • 没有找到相关文章

最新更新