Есть ли событие Form, которое вызывается прямо перед тем, как что-либо отображается на экране? - PullRequest
2 голосов
/ 21 сентября 2010

Я попытался переопределить событие OnLoad, но форма выводится до завершения этого метода.Я вызываю метод base.OnLoad.Но форма частично рисуется (артефакты видны) во время события.Я заметил это, потому что я попал в базу данных, и это занимает некоторое время.В этом случае я получаю некоторые данные и привязываю их к элементам управления формы.Пожалуйста, не говорите мне использовать отдельную ветку.Для простоты я бы предпочел просто показать занятый курсор во время загрузки данных.

ОБНОВЛЕНИЕ:

Хорошо, я думаю, что вы, ребята / девочки, меня убедили.Я буду использовать отдельную тему.Я не знал о BackgroundWorker, и его было очень легко реализовать.Теперь моя форма загружается быстро.И вдруг мои комбо-боксы заполняются.Но я бы хотел, чтобы пользователь не нажимал на комбо до их заполнения.Каков наилучший / стандартный способ сделать это с помощью Winforms?Есть ли способ отключить входные события в форме, пока не завершится фоновый рабочий?

Ответы [ 6 ]

2 голосов
/ 21 сентября 2010

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

Однако форма также еще не видна на этом этапе.Если вы хотите показать пустую форму, то я думаю, что возможное решение (я не пробовал это, но я думаю, что это должно работать) было бы вызвать this.Show() (для отображения формы) и Application.DoEvents(), чтобы позволить WinFormsобрабатывать события и отображать форму.

2 голосов
/ 21 сентября 2010

Я бы порекомендовал вам закрыть бланк Loading перед началом загрузки.

1 голос
/ 21 сентября 2010

Вы можете попробовать выполнить ваши дорогостоящие операции в конструкторе формы, чтобы, когда пришло время показывать форму, у нее уже были данные, которые ей необходимо отобразить.Также изучите методы SuspendLayout / ResumeLayout.

Но ни одно из этих решений не будет столь же изящным, как использование другого потока для выполнения дорогостоящих операций.

0 голосов
/ 22 сентября 2010

ComboBox имеет BeginUpdate() и EndUpdate(), которые можно вызывать при добавлении больших объемов данных или медленных данных в элемент управления.SuspendLayout() и 'ResumeLayout () `в форме также могут помочь с проблемами перерисовки.

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

Если вы используете фоновые потоки, вам необходимо убедиться, что вы вызываете их из основного потока пользовательского интерфейса, прежде чем запускать поток, иснова из основного потока пользовательского интерфейса, когда фоновый рабочий будет завершен.

0 голосов
/ 21 сентября 2010

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

В обработчике событий Shown включите песочные часы, сделайте свою работу и затем выключите песочные часы.

0 голосов
/ 21 сентября 2010

Я не уверен, поможет ли это или нет, но событие Move вызывается раньше Load.

...