等待Winform UserControl加载

时间:2011-12-14 15:20:30

标签: c# winforms user-controls infopath

我有一个自定义的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();         
     }
}

我尝试将takescreenshot()放在Form1_Load和Form1_Shown事件处理程序中,但屏幕截图仍然比表单加载早得多,因为FormControl.Open()需要花费很多时间。我可以将截屏功能放在button_click事件中,但我想自动执行此过程。我甚至尝试将它放在一个button_click程序中,并从Form_Load事件处理程序调用button.PerformClick。

请咨询。

3 个答案:

答案 0 :(得分:1)

您将事件UserControl.Activated用于此目的

UserControl1.Activated += new EventHandler(SeriesOfFunctions);

然后在此SeriesOfFunctions

中编写代码

您还有其他选择,例如UserControl.LoadUserControl.Activating

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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