Настройка DateTimePicker закрывает приложение, только когда оно вызвано действием по времени - PullRequest
0 голосов
/ 17 декабря 2011

У меня есть функция в C #, которая вначале устанавливает значение объекта DateTimePicker GUI на сегодняшнюю дату (время = полночь), а затем выполняет другие действия. При выполнении через кнопку GUI функция (DBIO_Morning) работает нормально. Но выполняется через синхронизированное действие:

private void SetupTimedActions()
{
   ...

   DateTime ref_morning = new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 8, 16, 0);
   if (DateTime.Now < ref_morning)
      At.Do(() => DBIO_Morning(), ref_morning);
   ...
}

ошибка во второй строке:

private void DBIO_Morning()
{
   DateTime date_current = new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 0, 0, 0);
   DTPicker_start.Value = date_current;
   ...
}

(объект At.Do здесь из третьего ответа: C # выполнить действие через X секунд )

Ответы [ 2 ]

0 голосов
/ 17 декабря 2011

Вы пытаетесь изменить элементы графического интерфейса из другого потока, неявно созданного At.Do().См. эту тему .

Использование System.Windows.Forms.Timer в At.Do() вместо System.Threading.Timer, вероятно, решит проблему.(Просто измените new Timer(...) на new System.Windows.Forms.Timer(...).)

0 голосов
/ 17 декабря 2011

Элементы управления не являются поточно-ориентированными, то есть вы не должны вызывать методы элемента управления из другого потока.Вы можете подождать, пока поток элемента управления не будет готов обработать ваше действие, используя Control.Invoke:

private void DBIO_Morning()
{
    DateTime date_current = new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 0, 0, 0);
    Action setValue = () => DTPicker_start.Value = date_current;
    if (DTPicker_start.InvokeRequired)
        DTPicker_start.Invoke(setValue);
    else
        setValue();
}
...