2013-10-11 3 views
2

У меня возникла проблема с проверкой компонентов texbox в проекте winforms C#.Остановить событие проверки при запуске, при смене фокуса текстового поля

У меня есть несколько текстовых полей в форме «Создать продукт», которая проверяет числа, пустой поток и т. Д. Если я перехожу из одного текстового поля (с проверкой) в другое, происходит событие проверки, и я не могу изменить фокус, т. Е. Застрять в текстовом поле, пока не наберу что-то. Поведение, которое я искал, должно запускать события проверки в текстовых окнах, когда я нажимаю кнопку «Создать», а не когда меняю фокус с одного текстового поля на другое.

Любые подсказки или правильная практика как решить эту проблему? Высоко ценится ..

Текущий код:

//Validation event for one of the textboxes. epProductName is an ErrorProvider: 
private void txtProductName_Validating(object sender, CancelEventArgs e) 
    { 
     if (Validator.IsEmpty(txtProductName)) 
     { 
      epProductName.SetError(txtProductName, "Field must not be empty"); 
      e.Cancel = true; 
     } 
     else 
     { 
      epProductName.Clear(); 
     } 
    } 

//Submit button click event 
private void btnSubmit_Click(object sender, EventArgs e) 
    { 
     if (ValidateChildren()) 
     { 
      try 
      { 
       SelectedProduct.ImagePath = txtChoosePicture.Text; 
       SelectedProduct.InstructionPath = txtChooseManual.Text; 
       SelectedProduct.SheetPath = txtChooseDatasheet.Text; 
       SelectedProduct.IsDeleted = false; 
       SelectedProduct.ProductNameNum = txtProductName.Text; 
       SelectedProduct.Description = txtProductDescription.Text; 
       SelectedProduct.DaysToExpire = int.Parse(txtUseTime.Text); 
       SelectedProduct.Category_Id = (int)cbChooseCategory.SelectedValue; 

       int productId = pm.CreateProduct(SelectedProduct); 

       MessageBox.Show("New Product: Id: " + productId + ", Product name: " + SelectedProduct.ProductNameNum, "New product created", 
            MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1); 

       this.Dispose(); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("Product was not created. Details: " + ex.Message, "Error", 
           MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1); 
      } 
     } 
    } 

ответ

3

Я рекомендую использовать элемент управления ErrorProvider (как и вы уже), но не используя проверку элемента управления вообще. В основном на вашей кнопке нажмите, вы проверите значение полей, а затем используйте метод .SetError поставщика ошибок.

Другой метод - использовать метод формы ValidateChildren. Вы можете отслеживать, должна ли выполняться проверка, и разрешать только проверку, если хотите. Или вы можете использовать манипулирование свойством CausesValidation на всех ваших элементах управления. Вот первый вариант,

private bool _validate = false; 

    private void button1_Click(object sender, EventArgs e) 
    { 
     _validate = true; 
     this.ValidateChildren(); 
     _validate = false; 
    } 

    private void textBox1_Validating(object sender, CancelEventArgs e) 
    { 
      if (_validate==true) 
      { 
       errorProvider1.SetError(textBox1, "test"); 
      } 
    } 
1

Установите свойство CausesValidation лжи на каждый элемент управления, чтобы предотвратить его от вызова методов проверки, когда фокус листы, объяснение here для последовательности событий:

Если для свойства CausesValidation установлено значение false, то подтвержденные события Validating и подавляются.

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

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