【问题标题】:Execute component code just before or after Form_Load event in .NET WinForms?在 .NET WinForms 中的 Form_Load 事件之前或之后执行组件代码?
【发布时间】:2011-01-16 23:17:45
【问题描述】:

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

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

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

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

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

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

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

还是我找错树了?

【问题讨论】:

    标签: winforms components form-load


    【解决方案1】:

    我不清楚为什么不能通过从表单的 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...");
        }
      }
    }
    

    【讨论】:

    • 我们已经有很多表格,我希望避免返回并向它们添加代码来解决这个问题,但似乎解决这个问题的最正确方法是这样做。我会查看你发布的代码。
    • 您发布的代码解决了问题。对于现有表单,我必须返回并手动设置 Host 属性,并且使用您发布的代码,新表单将自动修复此问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 2014-01-17
    • 2016-08-29
    • 2015-06-27
    • 2013-09-17
    • 2013-05-31
    • 1970-01-01
    相关资源
    最近更新 更多