2011-12-14 79 views
0

我有一個自定義Winform Infopath UserControl,它從SharePoint庫中加載表單。我有一系列的函數調用,打開窗體後,從窗體中拉出一些數據,甚至是一個截圖函數。但是表單加載需要很多時間,其他函數在表單加載之前完成得太快,這給我錯誤的結果。等待Winform UserControl加載

有沒有什麼方法可以讓我有一個等待功能,對於InfoPath表單完成加載等待被稱爲其它函數之前(在C#)

--update

示例代碼:?

的用戶控件裏面,我有一個表格初始化函數,基本上加載的形式

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事件處理器,但由於FormControl.Open()需要大量的時間還是可能導致比截圖的形式加載要早得多。我可以將截圖功能放在button_click事件中,但我想自動執行此過程。我甚至試圖把它放在button_click過程中,並從Form_Load事件處理程序中調用button.PerformClick。

請教。

+0

你可以發佈一些示例代碼來幫助說明你的問題嗎? – GrandMasterFlush 2011-12-14 15:23:04

回答

0

您可以定義一個布爾值並在您的信息路徑加載後將其設置爲false,將其設置爲true,並且只有在這種情況下才能在窗體構造函數中啓動intialize_component。或類似的東西!

1

您使用事件UserControl.Activated爲宗旨

UserControl1.Activated += new EventHandler(SeriesOfFunctions); 

然後編寫代碼在這個SeriesOfFunctions

您有其他選擇像UserControl.LoadUserControl.Activating

0

如果我正確地理解你的問題,看起來好像你正在進入競爭狀態,你的任務在不同的線程上執行。

如果你可以......我會使用窗體的On_Load函數;但是,如果您需要單獨的線程以獲得速度,以便後臺任務不必在啓動前等待表單,請查看ManualResetEvent。正確加載後,您可以在事件上設置form.on_load事件調用。