Красивая проверка правильности введенных данных в C#
От: kinstintin  
Дата: 22.03.03 17:50
Оценка:
Подскажите, пожалуйста, существует ли какой-нибудь стандартный (он же, поддержанный библиотеками) подход решения следующей задачи. Пытался откопать ответ в MSDN, но в результате сделал как умею.

Я считываю значение из TextBox'а (возможно нескольких)

Условия:
    Проверка введенных значений на допустимость
    Причем, если данные годятся, то можно нажать "OK"
    В случае некорректности данных должна быть доступна кнопка "Cancel"; остальные лучше тоже недоступны, но необязательно

Я решил проблему так :

   public class Form1 : System.Windows.Forms.Form
   {
      //...

      private int ok = 0; // количество неправильных TextBox'ов
      private bool prevState; // устанавливается при входе в конкретный TextBox

      //...

      private void textBox1_Enter(object sender, System.EventArgs e)
      {
         TextBox tb = (TextBox) sender;
         prevState = (tb.Text == "ok");
      }

      private void textBox1_TextChanged(object sender, System.EventArgs e)
      {
         TextBox tb = (TextBox) sender;

         // проверка корректности ввода

         bool currState = (tb.Text == "ok"); 
         if (currState != prevState)
         {
            if (currState)
               ok--;
            else
               ok++;
            prevState = currState;
            btnOK.Enabled = (ok == 0);
         }
      }

      private void Form1_Activated(object sender, System.EventArgs e)
      {
         ok = 0; // считаем, что данные по умолчанию на форме корректны
      }


Но был и другой вариант (на мой взгляд, более красивый):
Обработать событие Validating. Если TextBox.Text не годится, то установить свойство в CancelEventArgs
e.Cancel = true,
но проблема в том, что тогда все другие элементы управления на форме становятся недоступными (само по себе даже хорошо), в том числе и кнопка Cancel. Так вот, как сделать так, чтобы "Cancel" была доступна, все остальные элементы недоступны, пока не исправлено значение в поле, и при этом не использовать дополнительных переменных?

С уважением,
Константин Дурыничев.


22.12.03 18:05: Перенесено модератором из '.NET' — AVK
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.