2015-02-03 2 views
0

Есть ли способ остановить таймер, если пользователь использует текущую форму, например, запись в текстовое поле. Причина этого заключается в том, что каждую минуту я обновляю форму («Обновление данных из базы данных»), но если пользователь пишет в текстовое поле, а таймер добирается до этой минуты, он сбрасывает текстовое поле, и пользователь должен писать опять же, другими словами, он имеет ок. 1 минута, чтобы закончить запись в форме.Остановить таймер, если форма активна

private void timer1_Tick(object sender, EventArgs e) 
    {    
     SelectProgress(); 
    } 
private void SelectProgreso() 
    { 

     try 
     { 

      OleDbDataReader reader; 
      reader = oleDbCmd.ExecuteReader(); 
      reader.Read(); 

      progress= reader[1].ToString(); 

      int op = Int32.Parse(progress); 
      switch (op) 
      { 
       case 1: 
        progressBar1.Value = 20; 

        button1.Enabled = false; 
        break; 
       case 2: 
        progressBar1.Value = 40; 

        button1.Enabled = false; 
        break; 
       case 3: 
        progressBar1.Value = 60; 

        button1.Enabled = false; 
        break; 
       case 4: 
        progressBar1.Value = 80; 


        break; 
       case 5: 
        progressBar1.Value = 100; 

        button1.Enabled = false; 
        break; 
       default: 
        Console.WriteLine("Error"); 
        break; 
      } 
     } 
     catch (OleDbException error) 
     { 
      MessageBox.Show(error.ToString()); 
     } 
     finally 
     { 
      mycon.Close(); 
     } 
    } 

Я использую Visual Studio 2013 WindowsForm. Любая помощь или комментарий по этому поводу приветствуются. Спасибо.

ответ

1

Прикрепите второй таймер к TextChanged и т. Д. Событий вашего интерфейса вместе с остановкой основного таймера. Второе событие отметки таймеров затем запускает основной таймер через несколько секунд без ввода.

EDIT: Как так :)

Timer mainTimer; 
    Timer activityTimer; 

    public Form1() 
    { 
     mainTimer = new Timer(); 
     activityTimer = new Timer(); 
     mainTimer.Interval = 60000; 
     activityTimer.Interval = 2000; 
     activityTimer.Tick += activityTick; 
     InitializeComponent(); 
    } 

    private void activityTick(object sender, EventArgs e) 
    { 
     mainTimer.Start(); 
     activityTimer.Stop(); 
    } 

    private void onUserinput(object sender, EventArgs e) 
    { 
     mainTimer.Stop(); 
     activityTimer.Stop(); 
     activityTimer.Start(); 
    } 
+0

Я думаю, короткий пример кода может быть полезным для ОП. – rivarolle

+0

Добавил его, надеюсь, он объяснит, как я думал об этом;) – fantaztig

+0

Пошел с этой опцией, попробовал сделать функцию, ведьма возвращает bool, если любой из текстовых входов отличается, но в некоторых моих формах нет никаких из них, так как я использую вкладки с UC. @ BradleyDotNet, по-прежнему отличный совет для будущих проблем thx. – MoralesJosue

0

Да, вы могли бы добавить обработчики событий ко всем соответствующим элементам управления в форме, обновляющей поле «lastEdited» или что-то в этом роде, чтобы, когда таймер отключился, вы могли проверить, сколько времени прошло с момента последнего редактирования и только перезагружать данные, если они были достаточно длинными.

1

Там нет прямого способа сделать это, так же как не существует прямой способ определить, если Form является «активным» (среди прочих причин, потому что «активный» означают разные вещи для разных людей).

Некоторые вещи, которые вы можете сделать:

  1. Не создавайте редактируемые обновления элементов управления на обновления базы данных.
  2. Остановите таймер на пользовательском входе, что-то вроде прослушивания всех событий вашего управления TextChanged.
  3. Остановить таймер на Focus событий.

Обратите внимание, что всякий раз, когда вы остановить таймер, необходимо также определить логику, которая запускает его обратно (вероятно, еще один таймер!). В принципе, вам нужно определить, что на самом деле означает «активный» и «неактивный», и закодировать свою логику против этого.

0

Еще одна вещь, которую вы можете сделать - это проверить, не имеет ли фокус фокус, прежде чем обновлять его, а затем не обновлять его, если у него есть фокус.

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