【问题标题】:React on Form.Shown event in UserControl对 UserControl 中的 Form.Shown 事件做出反应
【发布时间】:2017-07-14 09:35:36
【问题描述】:

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

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

谢谢,

【问题讨论】:

    标签: c# winforms controls


    【解决方案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;
            }
    }
    

    【讨论】:

      【解决方案2】:

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

      1. Control.HandleCreated
      2. Control.BindingContextChanged
      3. Form.Load
      4. Control.VisibleChanged
      5. Form.Activated
      6. Form.Shown

      如您所见,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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-26
        • 2015-01-27
        • 2018-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-04
        • 2021-11-08
        相关资源
        最近更新 更多