组件和 ISupportInitialize:快速指南






4.39/5 (8投票s)
2005 年 2 月 10 日
1分钟阅读

55380

475
这是一份关于组件和ISupportInitialize的快速指南,旨在帮助中级程序员更有效地使用Visual Studio设计器。
引言
你是否想过创建像ErrorProvider
这样的控件,它位于UI设计器的非UI部分并执行操作? 这相当容易。 我将在这里展示如何从Component
和另一个有用的接口ISupportInitialize
派生。
组件 (Component)
ErrorProvider
位于设计器的非UI部分的原因是它是一个Component
。 Component
是CLR中所有MarshalByRefObject
的基类。 其他从Component
派生的类有ToolTip
、Control
、HelpProvider
、ImageList
和Menu
。
Component
还向容器公开站点,并允许它们进行通信。 Component
可以放置在实现IContainer
接口的任何对象中,并且可以查询和获取来自其容器的服务。
假设我想编写一个组件,它位于设计器的非UI部分(有人知道这部分叫什么吗?),并且在运行时完成所有初始化后,它将自动修复选项卡顺序。 现在,这里的选项卡顺序算法很简单,所以我们假设它有效。(感谢Scott McMaster,他写了这篇文章,并为本文提供了灵感。 抱歉破坏了你的TabOrderManager
。)
using System;
using System.Collections;
using System.Diagnostics;
using System.Windows.Forms;
using System.ComponentModel;
using System.Collections.Specialized;
namespace ComponentTest
{
public class TabOrderManager : Component, ISupportInitialize
{
public void SetTabOrder()
{
...
}
// ISupportInitialize members
public void BeginInit()
{
}
public void EndInit()
{
this.SetTabOrder();
}
}
}
一旦你将它放在你的表单上(并将你的表单分配给ContainerControl
属性),你应该注意到在InitializeComponent()
中发生了一些有趣的事情。
private void InitializeComponent()
{
this.tabOrderManager = new ComponentTest.TabOrderManager();
...
((System.ComponentModel.ISupportInitialize)(this.tabOrderManager)).BeginInit();
this.SuspendLayout();
...
this.Controls.Add(...);
((System.ComponentModel.ISupportInitialize)(this.tabOrderManager)).EndInit();
this.ResumeLayout(false);
}
ISupportInitialize
会自动在InitializeComponent
中添加这些内容。 通常,它们用于事务性地通知批处理初始化何时开始和结束。 现在,当调用TabOrderManager.EndInit()
时,它会设置表单上所有组件的选项卡索引。