btnClose被设置为CausesValidation=false但是没有生效。

4
我在表单上设置了一个关闭按钮,将“CausesValidation = false”,但当我运行它并尝试使用ErrorProvider关闭它时,它不会让我关闭。我甚至尝试在关闭过程中添加“errorProvider1.Clear()”或“errorProvider1.Dispose()”,但仍无法成功关闭窗体直到我处理掉错误为止。
我发现有效的方法是,在关闭时,如果我循环所有控件并设置“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();
    }
6个回答

14

请在你的asp:Button标签中添加这两个属性

CausesValidation="false"

UseSubmitBehavior="false"

CauseValidation应该足够了,但我认为因为你有一个服务器端的OnCLick事件,你还需要指定SubmitBehavior

Mario


4
这个问题涉及Windows Forms,而非ASP.NET。 - Adam Maras
6
尽管最初的问题是关于 Windows Forms 的,但我发现这个解决方案对于类似的 ASP.NET 情况也很有帮助。 - h0r53
这正是我在寻找的。感谢您对为什么需要UseSubmitBehavior属性进行解释。我之前并不知道。 - Rich

2
很可能发生的情况是,在您尝试点击取消按钮时,其中一个文本框已经获得了焦点,因此验证已经在进行中。您的解决方案通过遍历控件并将CausesValidation属性设置为False来实现。一种快捷方法是直接关闭表单的AutoValidate属性。
private void btnClose_Click(object sender, EventArgs e)
{
  this.AutoValidate = AutoValidate.Disable;
  this.Close();
}

2
一个类似的问题把我带到这里:在我的情况下,按钮的父控件(在我的情况下是一个面板)设置了CausesValidation为true;将其设置为false允许触发按钮的点击而不进行验证。

1
在我的经验中,处理这个问题最有效的方法是将控件的ValidationGroup设置为一个不存在的验证组名称。
**这种方法有些取巧,结果因人而异**
<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>

0

对于任何人来说,如果你也遇到了这个问题,我刚刚也遇到了同样的问题。

只需将按钮设置为使用:data-validate-target="none"

data-validate-target是你在aspx验证控件上寻找的标签,例如required等,在文本框失去焦点时立即在客户端触发。

现在对我有效。


0

唯一在Edge、Chrome和Opera上完美运行的选项是仅使用参数formNoValidate="false"。

我正在使用VS 2022社区版,但它没有提供这样的选项,但是通过寻找解决方案并使用EDGE的DEVTools,我发现了formNoValidate选项,并借助智能感知进行了添加。

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

<asp:Button ID="bHistory" runat="server" Text="Get Your last data" OnClick="bHistory_Click" formNoValidate="false" />


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