在.NET WinForms中的Form_Load事件之前或之后执行组件代码?

时间:2010-02-15 12:08:45

标签: winforms components form-load

我的组件与处理某些内部翻译的另一个组件发生冲突。

会发生什么是业务逻辑组件被执行,然后执行翻译系统,它会获取现在存在于表单中的文本,并尝试翻译它们。

问题是文本现在包含数字,日期,数据库相关文本等内容,但在执行业务逻辑之前,这些控件要么是空白的,要么包含为翻译准备的虚拟文本。

我想知道如何在表单的生命周期中的某个特定时间执行其代码的组件。

例如,如果我从业务逻辑组件中删除有问题的代码,以便它在构造时不做任何事情,那么翻译工作,如果我然后调用方法,我将该代码从Form_Load移动,那也是效果很好。

所以我想知道,对于我来说,是否有一种方法,从一个组件(即来自Component,而不是一个可视控件),在Form_Load之前或之后执行代码,或者至少在毕竟其他组件和控件已经设置好了吗?

它似乎不是从组件内部回到表单的任何链接,所以对我来说,挂钩到Load事件似乎也不可能。

还是我在错误的树上吠叫?

1 个答案:

答案 0 :(得分:2)

我不清楚为什么你不能通过从表单的Load事件处理程序显式调用组件的方法来解决这个问题。

使组件可以识别丢弃它的表单。可以诱导设计者将组件的属性初始化为表单实例。这是ErrorProvider使用的一种技术,例如,它在表单上绘制错误图标。然后可以将其扩展为让组件订阅表单的Load事件。这是一个例子:

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Windows.Forms;

namespace WindowsFormsApplication1 {
  public partial class Component1 : Component {
    public Component1() {
      InitializeComponent();
    }
    public Component1(IContainer container) {
      container.Add(this);
      InitializeComponent();
    }

    [Browsable(false)]
    public ContainerControl Host {
      get { return mHost; }
      set {
        if (mHost == null && value as Form != null && !DesignMode) {
          (value as Form).Load += Initialize;
        }
        mHost = value;
      }
    }
    private ContainerControl mHost;

    public override ISite Site {
      set {
        base.Site = value;
        if (value != null) {
          // Assign Host at design time
          IDesignerHost service = value.GetService(typeof(IDesignerHost)) as IDesignerHost;
          if (service != null) {
            IComponent rootComponent = service.RootComponent;
            this.Host = rootComponent as ContainerControl;
          }
        }
      }
    }
    private void Initialize(object sender, EventArgs e) {
      Console.WriteLine("initializing...");
    }
  }
}