Блокировка с задержкой

251
11 августа 2018, 12:00

День добрый, требуется заблокировать textbox`s на минуту, а потом снять блокировку, и если были введены неверные значения более двух раз. Если в третий раз опять ошибка, то + еще 2 минуты, и т.д. Я пробую следующим образом, но таймер задерживается навсегда:

private void timer1_Tick(object sender, EventArgs e)
        {
            timer1.Start();
            textBox3.Enabled = false;
            textBox4.Enabled = false;
            timer1.Interval+=1000;
            if (timer1.Interval == 15000)
            {
                timer1.Stop();
                textBox3.Enabled = true;
                textBox4.Enabled = true;
            }
        }
Answer 1

Можешь попробовать так. Не самый лучший способ, но вроде как работает.

В глобальные переменные:

int K = 0;
DateTime ed;

На кнопку

if (textBox2.Text != "testwork" && textBox2.Enabled)
{
    K++;
    if (K > 3) 
    { 
      ed = DateTime.Now.AddSeconds((K + 1) * 60); 
      textBox2.Enabled = false; 
      timer1.Start(); 
    }
    else if (K > 2) 
    { 
      ed = DateTime.Now.AddSeconds((K - 1) * 60); 
      textBox2.Enabled = false; 
      timer1.Start(); 
    }
    else if (K == 2) 
    { 
      ed = DateTime.Now.AddSeconds(60); 
      textBox2.Enabled = false; 
      timer1.Start(); 
    }
    else MessageBox.Show("Вы ввели неверное значение.");
}
else { MessageBox.Show("Good"); K = 0; }

На таймер:

if (DateTime.Now > ed) { textBox2.Enabled = true; timer1.Stop(); }
Answer 2

Можно пойти слегка другим путем.

Определить свой текстбокс, который будет сам хранить количество ошибок

public class MyAwesomeTextbox : TextBox
{
    public int ErrorInputCount {get;set;}   
}

При обновлении текста в текстбоксе, смотреть на количество ошибок и в зависимости от этого блочить или не блочить текстбокс

private async void Tb_TextChanged(object sender, EventArgs e)
{
    var tb = sender as MyAwesomeTextbox;
    if (tb.Text != "123")
    {
        tb.IsEnabled = false;
        tb.ErrorInputCount++;           
        switch(tb.ErrorInputCount)
        {
            case 1: // 1 ошибка - ничего страшного
                break;
            case 2: // 2 ошибки - блочим на секунду
                await Task.Delay(1000);
                break;
            case 3: // 3 ошибки - блочим на 2 секунды
                await Task.Delay(2000);
                break;
            default: // более 3 ошибок - 3 секунды
                await Task.Delay(3000);
                break;
        }
        tb.IsEnabled = true;
    }
    else
    {
        tb.ErrorInputCount = 0; // ввод верный, сброс счетчика ошибок
    }
}

Преимущества:

  1. никакого доп состояния на форме\окне
  2. отсутствие таймеров, код так немного почище
  3. один обработчик можно использовать для любого количества текстбоксов
READ ALSO
На сервере не работает $_POST

На сервере не работает $_POST

Работаю с Retrofit2, Volley даже уже Postman тестилНе работает $_POST на сервере

255
Добавление пользователя к facebook webhook

Добавление пользователя к facebook webhook

Есть следующий код и при его выполнении выбивает ошибку,расположенную нижеВ чем может быть причина?

277
Подсчитать сумму полей внутри дерева

Подсчитать сумму полей внутри дерева

Есть таблица с полями id(int), name(text), parent(int) и value(int), как подсчитать сумму value свою и всех детей? Через mysql или вывести дерево вложенных массивов...

233