等待Winform UserControl加载

我有一个自定义的Winform Infopath UserControl,它从sharepoint库加载一个表单。 打开表单后,我有一系列函数调用,从表单中提取一些数据,甚至是截屏function。 但是表单加载需要花费很多时间,并且其他函数在表单加载之前完成得太快,这给了我错误的结果。

有没有办法我可以有一个等待函数,在调用其他函数之前等待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事件处理程序中,但屏幕截图仍然比表单加载早得多,因为FormControl.Open()需要花费很多时间。 我可以将截图function放在button_click事件中,但我想自动执行此过程。 我甚至尝试将它放在一个button_click过程中,并从Form_Load事件处理程序中调用button.PerformClick。

请咨询。

您出于此目的使用事件UserControl.Activated

 UserControl1.Activated += new EventHandler(SeriesOfFunctions); 

然后在此SeriesOfFunctions编写代码

你有其他选择,如UserControl.LoadUserControl.Activating

您可以定义bool并将其设置为false,在加载infopath之后,将其设置为true,并且仅在这种情况下启动表单构造函数中的intialize_component 。 或类似的东西!

如果我正确理解你的问题,似乎你遇到了竞争条件,你在不同的线程上执行任务。

如果你可以…我将使用Form的On_Load函数; 但是,如果您需要为速度设置单独的线程,以便后台任务不必在启动之前等待表单,请查看ManualResetEvent 。 一旦正确加载,您就可以在事件上设置form.on_load事件调用。