如何确保文本框的TextChanged事件在按钮的Click事件之前被触发?

5
我有文本框和一个按钮。
该按钮使用由文本框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) {

    }

1
你的代码长什么样子?TextBox_TextChangedButton_Click默认已经是分开的事件了。 - Ian
你可以使用标志变量(ViewState)在textchanged事件中设置其值,并在按钮单击事件中使用该标志进行验证,如果需要,还可以重置该值。 - Adil
@Ian,问题已更新。 - Uğur Gümüşhan
使用标志来确定tprice中的文本是否有效是一个好主意。这样,不仅可以检查textBox的textChanged事件是否已经触发,还可以在保存之前检查它是否有效,这是一种更常见的做法。 - Ian
4个回答

1
据我所知,没有办法确保事件顺序 TextChanged->ButtonClick。您应该使用不同的方法。
  1. TextChanged 逻辑移至 ButtonClick 事件中,或
  2. TextBoxAutoPostBack=true,但这需要额外的后台处理。
因此,我建议将逻辑放入 ButtonClick 中,并删除 TextChanged 事件。

@UğurGümüşhan:我不明白什么是昂贵的。你没有数十亿个文本框,所以工作量应该可以忽略不计。 - Tim Schmelter

1

编辑:根据您的另一个评论,如果您的文本框是通过编程添加和删除的,您还可以创建一个自定义用户控件,包含按钮和文本框,并实现此逻辑,然后以编程方式添加该用户控件。这样,一个按钮和文本框将彼此相关,并且不知道其他的。我不确定您想要做什么上下文,因此这种方法可能不是最好的。


使用一个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.Enabled属性,以完全禁用按钮。从用户体验的角度来看,这更好。

编辑:根据您的评论,您还可以动态添加和删除事件处理程序。这种方法的变化可能对您有益。

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;
}

0

是的,这是可能的...只需查看以下解决方案...它基本上是使用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);
}

它会工作的!!


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接