2013-04-30 2 views
2

У меня есть кнопка закрытия на моей форме, которую я установил на CausesValidation = false. Но когда я запускаю его и пытаюсь закрыть его с помощью ErrorProvider, это не позволит мне закрыться. Я даже попытался добавить к закрытой процедуре errorProvider1.Clear() или errorProvider1.Dispose() but, но мне не удавалось закрыть форму, пока я не позабочусь об ошибке.btnClose установлен в CausesValidation = false, но не работает

То, что я нашел для работы, находится в завершении, если я перебираю все элементы управления и устанавливаю 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(); 
    } 

ответ

3

Попробуйте добавить эти два атрибута в вашем жерех: Кнопка тегов

CausesValidation = «ложь» UseSubmitBehavior = «ложь»

CauseValidation должно быть достаточно, но я верю, потому что у вас есть сервер стороне OnCLick, вам также необходимо указать SubmitBehavior.

Марио

+3

-1 Вопрос только в Windows Forms, а не в ASP.NET. –

+1

Хотя исходный вопрос был в терминах Windows Forms, я нашел это решение полезным для подобных ситуаций в ASP.NET. –

1

Скорее всего, что происходит в том, что один из TextBoxes иметь фокус в то время, вы пытаетесь нажать кнопку Отмена, так что проверка уже происходит. Ваше решение работает, пройдя элементы управления и вернув свойство CausesValidation в значение False.

Метод укороченный это просто выключить форме в AutoValidate свойство:

private void btnClose_Click(object sender, EventArgs e) 
{ 
    this.AutoValidate = AutoValidate.Disable; 
    this.Close(); 
} 
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> 
0

Похожая проблема привела меня сюда: в моем случае родительский контроль кнопки (в моем случае Panel) был CausesValidation установлен верно; установка его в значение false позволяет щелкнуть кнопку нажатием кнопки без проверки.

0

Для тех, кто сходит с ума, у меня была такая же проблема только сейчас. Просто установите эту кнопку для использования: data-validate-target = "none"

data-validate-target - это тег, который вы ищете для контроля проверки aspx, такого как требуемый и т. Д., Который запускается на стороне клиента, как только коробка теряет фокус.

Теперь работаю для меня.

Смежные вопросы