65.9K
CodeProject 正在变化。 阅读更多。
Home

组件和 ISupportInitialize:快速指南

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.39/5 (8投票s)

2005 年 2 月 10 日

1分钟阅读

viewsIcon

55380

downloadIcon

475

这是一份关于组件和ISupportInitialize的快速指南,旨在帮助中级程序员更有效地使用Visual Studio设计器。

Sample Image

引言

你是否想过创建像ErrorProvider这样的控件,它位于UI设计器的非UI部分并执行操作? 这相当容易。 我将在这里展示如何从Component和另一个有用的接口ISupportInitialize派生。

组件 (Component)

ErrorProvider位于设计器的非UI部分的原因是它是一个ComponentComponent是CLR中所有MarshalByRefObject的基类。 其他从Component派生的类有ToolTipControlHelpProviderImageListMenu

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()时,它会设置表单上所有组件的选项卡索引。

© . All rights reserved.