4

我的表单上有一个关闭按钮,我设置为CausesValidation = false。但是当我运行它并尝试使用 ErrorProvider 关闭它时,它不会让我关闭。我什至尝试添加到关闭例程中errorProvider1.Clear(),或者errorProvider1.Dispose() but在我处理错误之前关闭表单仍然没有运气。

如果我遍历所有控件并进行设置,CausesValidation=false那么我发现可以正常工作,然后尽管存在任何错误,但通过关闭表单可以按预期工作。

   private void btnAdd_Click(object sender, EventArgs e)
    {
        if (!this.ValidateChildren()) return;

        DoAddCommand();
    }

    private void DoAddCommand()
    {
        //input
        string input1 = textBox1.Text;
        string input2 = textBox2.Text;
        //process
        this.ValidateChildren();
        decimal sum = Class1.Add(input1, input2);

        //output
        lblSum.Text = sum.ToString();
    }

    private void textBoxNumberEntry_Validating(object sender, System.ComponentModel.CancelEventArgs e)
    {
        TextBox textBox = sender as TextBox;
        decimal number1 = 0;

        try
        {
            number1 = decimal.Parse(textBox.Text);
            errorProvider1.Clear();
        }
        catch (FormatException)
        {
            errorProvider1.SetError(textBox, "Enter a valid number");
            e.Cancel = true;
        }
    }

    private void btnClose_Click(object sender, EventArgs e)
    {
        foreach (Control item in this.Controls)
        {
            item.CausesValidation = false;
        }
        this.Close();
    }
4

6 回答 6

13

asp:Button尝试在标签中添加这两个属性

CausesValidation="false"

UseSubmitBehavior="false"

CauseValidation应该足够了,但我相信因为您有一个服务器端事件OnCLick,您还需要指定 SubmitBehavior。

马里奥

于 2013-10-15T17:42:55.427 回答
2

Most likely what is happening is that one of the TextBoxes have the focus at the time you try to hit the Cancel button, so the validation is already occurring. Your solution works by going through the controls and setting the the CausesValidation property back to False.

A short-cut method is to just turn off the form's AutoValidate property:

private void btnClose_Click(object sender, EventArgs e)
{
  this.AutoValidate = AutoValidate.Disable;
  this.Close();
}
于 2013-10-15T18:58:16.760 回答
2

一个类似的问题导致我在这里:在我的情况下,按钮的父控件(在我的情况下是面板)将 CausesValidation 设置为 true;将其设置为 false 允许在没有验证的情况下触发按钮的单击。

于 2015-02-09T12:44:21.890 回答
1

根据我的经验,处理此问题的最有效方法是将控件上的 ValidationGroup 设置为不存在的验证组名称。

** 这是 hacky,所以 YMMV **

<asp:LinkButton ID="DoSomethingButton" runat="server"
    ValidationGroup="NonExistent" 
    OnClientClick="return confirm('Are you sure you want to do something?');" 
    Text="Do something" 
    OnClick="DoSomething_Click">
</asp:LinkButton>
于 2014-08-14T17:47:38.990 回答
0

至少在边缘、chrome 和 Opera 上完美运行的唯一选项是仅使用参数 formNoValidate="false"

我正在使用 VS 2022 社区版,但它没有为我提供这样的选项,但在寻找解决方案并使用 EDGE 的 DEVTools 时,我在智能感知的帮助下找到了 formNoValidate 选项。

然后我回到VS并添加了这个按钮中的选项:

<asp:Button ID="bHistory" runat="server" Text="获取你最后的数据" OnClick="bHistory_Click" formNoValidate="false" />

于 2022-02-25T22:59:35.077 回答
0

对于任何对此感到生气的人,我刚才遇到了同样的问题。只需设置要使用的按钮:data-validate-target="none"

data-validate-target 是您在 aspx 验证控件(例如 required 等)上寻找的标签,一旦框失去焦点,就会在客户端触发。

现在为我工作。

于 2016-12-21T13:47:01.200 回答