1

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

发生的情况是业务逻辑组件被执行,然后翻译系统执行,它拾取现在出现在表单中的文本,并尝试翻译它们。

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

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

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

所以我想知道,有没有办法让我从一个组件(即来自Component,而不是可视控件),在 Form_Load 之前或之后执行代码,或者至少在所有其他组件和控件都已设置之后向上?

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

还是我在叫错树?

4

1 回答 1

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...");
    }
  }
}
于 2010-02-15T13:32:32.290 回答