Office控件开发总结-开发Windows 窗体控件简单概述

1.1.     Windows窗体控件的种类及介绍

Windows 窗体支持三种用户定义的控件:复合、扩展和自定义。

复合控件是通过 UserControl 继承创建的控件复合控件包含与每个包含的 Windows 窗体控件相关联的所有固有功能,允许您有选择地公开和绑定它们的属性。复合控件还提供了大量的默认键盘处理功能,您不需要任何额外的开发。

扩展控件是通过从现有的 Windows 窗体控件继承创建的控件。此方法使您得以保留 Windows 窗体控件的所有固有功能,然后通过添加自定义属性、方法或其他功能扩展此固有功能。可以使用此选项重写基控件的绘制逻辑,然后更改该控件的外观以扩展其用户界面。

自定义控件是通过从 Control 继承创建的控件。Control 类提供控件所需的所有基本功能(包括鼠标和键盘处理事件),但不提供控件特定的功能或图形界面。

1.2.     如何对Windows 窗体控件进行属性、方法和事件的定义及执行

以下代码片段为自定义控件OfficeEmbedCtl定义了一个名为RefillVisible的自定义属性。

public partial class OfficeEmbedCtl : UserControl {

   ...

    private bool _refillVisible;

    ///<summary>

    /// 重新填充按钮是否显示

    ///</summary>

    [Category("行为"), Description("重新填充按钮是否显示")]

    public bool RefillVisible

    {

        get

        {

            return _refillVisible;

        }

        set

        {

            _refillVisible = value;

        }

    }

...

}

以下代码片段说明了OfficeEmbedCtl自定义控件如何定义自定义事件 ValueChanged

public partial class OfficeEmbedCtl : UserControl {

   ...

private EventHandler onValueChanged;

    ///<summary>

    /// 值改变时发生

///</summary>

    public event EventHandler ValueChanged

    {

        add

        {

            onValueChanged += value;

        }

        remove

        {

            onValueChanged -= value;

        }

    }

    protected virtual void OnValueChanged(EventArgs e)

    {

        if (ValueChanged != null)

        {

            ValueChanged(this, e);

        }

}

   ...

}

1.3.     如何对 Windows 窗体控件进行线程安全调用

以下代码片段说明了OfficeEmbedCtl自定义控件如何对窗体控件进行线程安全调用。

public partial class TemplateForm : BaseForm {

   ...

    private void officeEmbedCtl1_ImportExcelClick(object sender, EventArgs e)

    {

        Thread thread = new Thread(new ThreadStart(delegate()

        {

            Invoke(new MethodInvoker(delegate

            {

                OpenFileDialog file = new OpenFileDialog();

                file.Filter = "Excel 工作簿(*.xlsx)|*.xlsx";

                if (file.ShowDialog(this) == DialogResult.OK)

                {

                    officeEmbedCtl1.ImportExcel(file.FileName);

                }

            }));

        }));

        thread.SetApartmentState(ApartmentState.STA);

        thread.Start();

}

   ...

}

posted @ 2011-10-09 21:25  至软  阅读(2726)  评论(2编辑  收藏  举报