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

时间:2016-02-15 09:12:44

标签: c# asp.net .net events event-handling

我有文本框和按钮。

该按钮使用由textbox 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) {

    }

4 个答案:

答案 0 :(得分:1)

Afaik无法确保事件订单TextChanged - > ButtonClick。 你应该采用不同的方法。

  1. TextChanged逻辑移至ButtonClick事件或
  2. 制作TextBox AutoPostBack=true,但这需要额外的回发
  3. 所以我建议将逻辑放入ButtonClick - 并删除TextChanged事件。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

是的可能 ...只是看看下面的解决方案..它基本上是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);
}

工作!!

答案 3 :(得分:0)

  1. 启用“保存”按钮的“CauseValidation”选项。
  2. 调用焦点编辑器的DoValidate方法。
  3. 调用表单的ValidateChildren方法。
  4. https://msdn.microsoft.com/de-de/library/ms158374(v=vs.110).aspx