Подождите, пока Winform UserControl загрузится - PullRequest
0 голосов
/ 14 декабря 2011

У меня есть пользовательский Winform Infopath UserControl, который загружает форму из библиотеки sharepoint. После открытия формы у меня есть ряд вызовов функций, чтобы извлечь некоторые данные из формы, даже функцию снимка экрана. Но загрузка формы занимает много времени, и другие функции завершают работу слишком быстро, задолго до загрузки формы, что дает мне неверные результаты.

Можно ли как-нибудь использовать функцию ожидания, которая ожидает завершения загрузки формы infopath до вызова других функций? (В c #)

- Обновление

Пример кода:

Внутри UserControl, у меня есть функция инициализации формы, которая в основном загружает форму

public void InitializeInfoPathForm(string myurl)
        {
            if (this.IsInitialized) return;

            CreateForm(new Uri(myurl),null);
        }

public void CreateForm(
            Uri formUrlName,
            Stream dataStream)
        {
            TestInitialization();

            try
            {
                this.formControl.Close();

                // Open / create a form
                if (dataStream != null)
                    formControl.Open(
                        formUrlName.ToString()
                        );
                else
                {
                    formControl.Open(
                        formUrlName.ToString());
                }
                RefreshView(UIStatesForm.DocumentReadMode);
                }
            catch (Exception)
            {
                RefreshView(UIStatesForm.NoDocumentAvailable);

                throw;
            }
        }

Winform выглядит так:

public partial class Form1 : Form    
{    
     public Form1(string sharepoint_url)    
     {    
        InitializeComponent();

         this.infoPathUserControl1.InitializeInfoPathForm(sharepoint_url);
         takescreenshot();         
     }
}

Я пытался поместить takecreenshot () в обработчики событий Form1_Load и Form1_Shown, но все же снимки экрана появляются намного раньше, чем загрузка формы, потому что FormControl.Open () занимает много времени. Я мог бы поместить функцию скриншота в событие button_click, но я хочу автоматизировать эту процедуру. Я даже попытался поместить его в процедуру button_click и вызвал button.PerformClick из обработчика событий Form_Load.

Советы.

Ответы [ 3 ]

1 голос
/ 14 декабря 2011

Вы используете событие UserControl.Activated для цели

UserControl1.Activated += new EventHandler(SeriesOfFunctions);

Затем напишите свой код в этом SeriesOfFunctions

У вас есть другие варианты, такие как UserControl.Load, UserControl.Activating

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

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

Если вы можете ... Я бы использовал функцию On_Loadформы;однако, если вам нужно иметь отдельные потоки для скорости, чтобы фоновым задачам не приходилось ожидать форму перед запуском, взгляните на ManualResetEvent .Вы можете установить вызов события form.on_load для события, как только оно будет правильно загружено.

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

Вы можете определить bool и установить его в false, после загрузки вашего информационного пути установите его в true и только в этом случае запустите intialize_component в конструкторе формы. или что-то в этом роде!

...