2011-12-14 5 views
0

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

Есть ли способ, что я могу иметь функцию ожидания, что ждет формы InfoPath, чтобы закончить загрузку до того, как другие функции называются (в C#)

--update

Пример кода:

Внутри 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();   
    } 
} 

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

Рекомендации по Pls.

+0

Можете ли вы разместить несколько примеров кода, чтобы помочь проиллюстрировать вашу проблему? – GrandMasterFlush

+0

Подпишитесь на отображаемое событие формы. Поместите «другие функции» в обработчик события. –

ответ

0

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

1

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

UserControl1.Activated += new EventHandler(SeriesOfFunctions); 

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

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

0

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

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

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