等待Winform UserControl加载

本文关键字:加载 UserControl Winform 等待 | 更新日期: 2023-09-27 18:17:55

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

是否有任何方法我可以有一个等待函数,等待infopath表单完成加载之前,其他函数被调用?(c#)

——更新

示例代码:

在UserControl中,我有一个form initialize函数,它加载form

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_show事件处理程序,但仍然屏幕截图发生比表单加载早得多,因为FormControl.Open()需要很多时间。我可以把截图功能在一个button_click事件,但我想自动化这个过程。我甚至试着把它放在button_click过程中并调用button。从Form_Load事件处理程序中执行。

请建议。

等待Winform UserControl加载

您使用事件UserControl.Activated的目的

UserControl1.Activated += new EventHandler(SeriesOfFunctions);

然后在此SeriesOfFunctions

中编写代码

您有其他选择,如UserControl.Load, UserControl.Activating

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

如果我正确理解你的问题,似乎你正在遇到一个竞争条件,你有任务在单独的线程上执行。

如果你能…我会使用表单的On_Load函数;然而,如果你需要有单独的线程来提高速度,这样后台任务就不必在开始之前等待表单,看看ManualResetEvent。你可以有这个表格。On_load事件调用设置在事件正确加载后。