对UserControl中的Form.Shown事件做出反应

时间:2017-07-14 09:35:36

标签: c# winforms controls

我已经创建了自定义控件。我希望在Form.Shown事件之后在我的自定义控件中执行。我尝试过在 Form.Shown 事件之前触发的 Control.GotFocus 事件。我希望在 Form.Shown 事件之后对我的控件进行更改。

有可能吗?如果是的话,请建议我怎么做?

谢谢,

2 个答案:

答案 0 :(得分:1)

您可以注册参加活动:

public class MyControl : UserControl
{
       // you need a reference to the hosting Form
       public MyControl(Form frmHost)
       {
            frmHost.Shown += FormHost_Shown;
       }

       private void FormHost_Shown(object sender, EventArgs e)
       {
           // Do your work
       }
}

当您创建控件的实例时,只需传递对托管表单的引用:

this.Controls.Add(new MyControl(this));

如果您需要无参数构造函数,可以将托管Form作为控件的属性,并在Shown事件发生之前设置该属性:

public class MyControl : UserControl
{
       private Form frmHost;

       public Form FrmHost
       {
           get
           {
               return frmHost;
           }

           set
           {
               frmHost = value;
               frmHost.Shown += FormHost_Shown;
           }
       }

       private void FormHost_Shown(object sender, EventArgs e)
       {
           // Do your work
       }
}

public class MyForm : Form
{
        public MyForm()
        {
             InitializeComponent();
             // User control was created elsewhere (perhaps in the designer)
             myUserControl.FrmHost = this;
        }
}

答案 1 :(得分:0)

不,第一次激活窗体时,documented事件顺序如下:

  1. Control.HandleCreated
  2. Control.BindingContextChanged
  3. Form.Load
  4. Control.VisibleChanged
  5. Form.Activated
  6. Form.Shown
  7. 如您所见,Shown是最后一次被发射的事件。您需要在自定义基础Form中实施自己的活动:

    public event EventHandler AfterShwon;
    
    protected override void OnShown(EventArgs e)
    {
         base.OnShow(e);
         OnAfterShown(e);
    }
    
    protected virtual void OnAfterShown(e)
    {
         AfterShwon?.Invoke(this, e);
    }