Как заставить кнопки, TextBoxes перерисовать на форме после закрытия MessageBox в C # - PullRequest
5 голосов
/ 13 января 2009

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

Вопрос в том, как заставить все перекрасить в форме. Проблема в том, что класс messageBox не знает формы, которая его назвала

Frank

Ответы [ 5 ]

8 голосов
/ 13 января 2009

Вы можете попробовать с

Application.DoEvents()

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

6 голосов
/ 13 января 2009

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

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

3 голосов
/ 13 января 2009

Проблема здесь в том, что у вас есть обработка, которая происходит в потоке пользовательского интерфейса и блокирует сообщение рисования. Вызов Refresh или Invalidate не исправит это, поскольку вы все еще блокируете поток, который будет выполнять эти операции.

Скорее, вы должны взять эту обработку и переместить ее в другой поток, а затем обновить ваш поток пользовательского интерфейса (скорее всего, с помощью метода Invoke, скорее всего, чем нет), когда будете выполнять работу с фоновым потоком.

0 голосов
/ 13 января 2009

Ваша проблема в том, что вы выполняете свою работу в потоке пользовательского интерфейса. Пользовательский интерфейс не будет перекрашен, пока ваш метод не вернется, что позволит продолжить цикл сообщений Windows.

Решение состоит в том, чтобы запустить ваш метод работы в другом потоке. Возможно, класс BackgroundWorker хорошо решит вашу проблему.

Edit: Смотрите эту статью для подробного объяснения:
http://www.yoda.arachsys.com/csharp/threads/winforms.shtml

0 голосов
/ 13 января 2009

Чтобы все перерисовать, вы можете вызвать Invalidate () в главной форме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...