.NET的.NET控件,第1张

NET标准控件根据其应用环境分为两类:

Windows Form控件:主要用于Windows应用程序的开发。所有的Windows控件都是从Control类中派生来的,该类包含了所有用户界面的Windows Form组件,其中也包括Form类。Control类中包括了很多位所有控件所共享的属性、事件和方法。它包含复选框、文本框、按钮、标签、图像列表等。

Web窗体控件:主要用于Web应用程序的开发。它是专门针对AspNETWeb窗体设计的服务器控件。Web窗体控件包含在命名空间SystemWebUIWebControls中,当用户使用Visual Studio创建Web窗体页面时,会自动在后台代码文件中添加引用该命名空间的Using语句。

NET Compact Framework 提供了可以满足大多数设备项目需要的Windows Form控件。若要使用这些控件没有的功能,可以从公共控件派生您自己的自定义控件。可以通过定义从 Control 类或从程序集中的现有 UserControl 继承的公共类型创建自定义控件。

最简单的控件自定义是重写公共控件的方法。例如,可以重写 TextBox 控件的 OnKeyPress 继承方法,提供将输入限制为数字字符的代码。

如若觉得自定义控件过于浪费时间和复杂,也可以从受信任的来源下载控件,并通过添加引用来导入自定义控件。支持这些自定义的NET的控件有:ComponentOne Studio,Spread,ActiveReports、MultiRow 等。

  前言

 ASP NET项目开发指南 前言

  第 章 酒店管理系统

  系统功能

  系统预览

  系统操作流程

  系统架构

  系统功能模块

  数据库需求分析

  数据库概念结构设计

  数据表设计

  数据表之间的关系

  数据库连接编写

  ST_PageBase类和ST_ModuleBase

  界面设计( )

  界面设计( )

  登录系统( )

  登录系统( )

  房间类型管理页面的搭建( )

  房间类型管理页面的搭建( )

  房间类型的修改和删除( )

  房间类型的修改和删除( )

  房间类型的添加( )

  房间类型的添加( )

  房间信息管理页面( )

  房间信息管理页面( )

  房间信息的修改和删除( )

  房间信息的修改和删除( )

  房间信息的添加( )

  房间信息的添加( )

  房间经营管理页面的搭建( )

  房间经营管理页面的搭建( )

  房间使用信息的查询

  客户信息查询( )

  客户信息查询( )

  经营状况统计( )

  经营状况统计( )

  配置概述

  Web Config中的配置信息

  自定义Web Config文件配置节

  小结

  第 章 企业信息管理系统

  系统功能

  系统预览

  系统操作流程

  系统架构

  系统功能模块

  数据库需求分析

  数据库概念结构设计

  数据表设计

  数据表之间的关系

  数据库连接编写

  数据层类( )

  数据层类( )

  界面控件设计( )

  界面控件设计( )

  登录页面

  新闻的添加( )

  新闻的添加( )

  新闻的删除

  产品的添加( )

  产品的添加( )

  产品的更新和删除( )

  产品的更新和删除( )

  用户管理

  用户信息的处理( )

  用户信息的处理( )

  已处理订单的管理( )

  已处理订单的管理( )

  未处理订单的管理( )

  未处理订单的管理( )

  界面预览

  新闻列表

  产品展示

  订购信息

  查看订单( )

  查看订单( )

  ADO NET概述

  ADO NET结构

  ADO NET连接方式

  小结

  第 章 Blog

  系统功能

  系统预览

  系统操作流程

  系统架构

  系统功能模块

  数据库需求分析

  数据库概念结构设计

  数据表设计

  数据表之间的关系

  数据库连接编写

  界面头尾设计

  界面主体框架

  登录系统

  类别管理页面

  类型的修改和删除

  类型的添加

  文章管理页面

  文章的修改和删除

  添加文章( )

  添加文章( )

  评论的删除( )

  评论的删除( )

  链接管理页面( )

  链接管理页面( )

  链接的删除

  链接的添加

  留言管理页面

  留言回复

  留言删除

  普通用户界面

  博客列表( )

  博客列表( )

  推荐文章

  网友回应

  友情BLOG

  个人资料( )

  个人资料( )

  XML基础知识

  C#操作XML( )

  C#操作XML( )

  小结

  第 章 网络书店系统

  系统功能

  系统预览

  系统操作流程

  系统架构

  系统功能模块

  数据库需求分析

  数据库概念结构设计

  数据表设计

  数据表之间的关系

  数据库连接编写

  数据库操作组件

  界面头尾设计

  登录系统( )

  登录系统( )

  解决方案结构

  订单的展示( )

  订单的展示( )

  订单的发货和作废( )

  订单的发货和作废( )

  订单的发货和作废( )

  管理员界面 商品(即图书)管理

  图书类别的显示

  图书类别和图书信息的管理( )

  图书类别和图书信息的管理( )

  图书类别和图书信息的管理( )

  图书类别和图书信息的管理( )

  图书类别和图书信息的管理( )

  图书类别和图书信息的管理( )

  图书类别和图书信息的管理( )

  图书类别和图书信息的管理( )

  图书类别和图书信息的管理( )

  图书的显示( )

  图书的显示( )

  添加到购物车

  购物车信息( )

  购物车信息( )

  订单的生成( )

  订单的生成( )

  个人信息的修改( )

  个人信息的修改( )

  订单的查看

  简介

  页面级输出缓存

  用户控件级输出缓存

  缓存API:使用Cache对象

  小结

       编辑推荐

       ASP NET MVC 框架揭秘

       ASP NET开发宝典

lishixinzhi/Article/program/net/201311/16007

1打开VS2008-新建一个工程-选译ASP。NET服务器控件

2自动生成一个文件,打代码拷进去,调试好程序

3点击“生成菜单-生成XX”

4到 工程目录\bin\Debug 找到dll文件把它拷到一个固定目录里如:DotNet_DLL里

============附带一个我重写Repeater的代码===================

using System;

using SystemCollectionsGeneric;

using SystemComponentModel;

using SystemLinq;

using SystemText;

using SystemWeb;

using SystemWebUI;

using SystemWebUIWebControls;

using SystemData;

using SystemDataSqlClient;

using SystemDataOleDb;

namespace lwf_MVClwf_Controls

{

[DefaultProperty("pageIndex")]

[ToolboxData("<!--Repeater Begin --><{0}:Repeater ID=\"Rep_list\" runat=\"server\" EnableViewState=\"false\" DisplayPageing=\"Always\"> <ItemTemplate> </ItemTemplate> </{0}:Repeater><!--Repeater End -->")]

public class Repeater : SystemWebUIWebControlsRepeater

{

private int _recordcount = 0;

private int _pageSize = 0;

private int _pageIndex = 1;

private string _PID = "";

private string _CssClass = "CssPage"; //输出数据流时设一个样式给它样式名为CssPage

private object _DataSourceList;

private PagedDataSource _pds = new PagedDataSource();

//public bool _DisplayPageing;

public MyEnum _DisplayPageing;

private MyEnumLanguage _Language;

//构造函数

public Repeater()

{

}

#region ____________控件属性:RecordCount、pageSize、pageIndex、PID、CssClass、DataSource1____________

[Bindable(true)]

[Category("data")]

[DefaultValue("1")]

[Localizable(true)]

[Description("记录总数")]

public int RecordCount

{

get

{

return _recordcount;

}

set

{

_recordcount = value;

}

}

[Bindable(true)]

[Category("data")]

[DefaultValue("15")]

[Localizable(true)]

[Description("单页记录数")]

public int pageSize

{

get

{

return _pageSize;

}

set

{

_pageSize = value;

}

}

[Bindable(true)]

[Category("data")]

[DefaultValue("1")]

[Localizable(true)]

[Description("当前页码")]

public int pageIndex

{

get

{

return _pageIndex;

}

set

{

_pageIndex = value;

}

}

[Bindable(true)]

[Category("data")]

[DefaultValue("")]

[Localizable(true)]

[Description("其它参数传递")]

public string PID

{

get

{

return _PID;

}

set

{

_PID = value;

}

}

[Bindable(true)]

[Category("data")]

[DefaultValue("CssPage")]

[Localizable(true)]

[Description("连接样式")]

public string CssClass

{

get

{

return _CssClass;

}

set

{

_CssClass = value;

}

}

[Bindable(true)]

[Category("data")]

[DefaultValue("")]

[Localizable(true)]

[Description("数据源,DataTable")]

public object DataSource1

{

get

{

return _pds;

}

set

{

switch (valueGetType()ToString())

{

case "SystemDataDataTable":

_recordcount = ((DataTable)value)RowsCount;

_pdsDataSource = ((DataTable)value)DefaultView;

break;

case "SystemCollectionsGenericList`1[SystemObject]":

_recordcount = ((List<object>)value)Count;

_pdsDataSource = (List<object>)value;

break;

case "SystemDataSqlClientSqlDataReader":

DataTable i_dt = NormalConvertDataReaderToDataTable((SqlDataReader)value);

_recordcount = i_dtRowsCount;

_pdsDataSource = i_dtDefaultView;

break;

case "SystemDataSqlClientOleDbDataReader":

DataTable i_dtOle = NormalConvertDataReaderToDataTable((OleDbDataReader)value);

_recordcount = i_dtOleRowsCount;

_pdsDataSource = i_dtOleDefaultView;

break;

default:

_recordcount = ((DataTable)value)RowsCount;

_pdsDataSource = ((DataTable)value)DefaultView;

break;

}

_pdsAllowPaging = true;

_pdsPageSize = _pageSize;

_pdsCurrentPageIndex = this_pageIndex - 1;

baseDataSource = _pds;

}

}

public MyEnum DisplayPageing

{

get { return _DisplayPageing; }

set { _DisplayPageing = value; }

}

public enum MyEnum

{

Always = 1,

Auto = 2,

Never = 3

}

public MyEnumLanguage Language

{

get { return _Language; }

set { _Language = value; }

}

public enum MyEnumLanguage

{

Chinese = 1,

English = 2

}

#endregion

//外部使用

public string ThePage()

{

string retStr = "";

retStr = thisThePage(_recordcount, _pageSize, _pageIndex, _PID, _CssClass);

return retStr;

}

//分页函数,为输出显示流提供HTML代码

/// <summary>

/// 分页函数

/// </summary>

/// <param name="i_RecordCount">总记录数</param>

/// <param name="i_pageSize">每页记录数</param>

/// <param name="i_pageIndex">当前页数</param>

/// <param name="i_PID">其它参数</param>

/// <param name="i_CssClass">连接样式</param>

/// <returns>HTML代码</returns>

public string ThePage(int i_RecordCount, int i_pagesize, int i_pageIndex, string i_PID, string i_CssClass)

{

int i_Pcount = 0;

int i_StartPageNum;

int i_EndPageNum;

string i_pagerString = "";

string i_pagerString_ENG = "";

i_pagerString = i_pagerString + "<style type=\"text/css\">\nCssPage {font-family: Arial, Helvetica, sans-serif;font-size: 12px;line-height: 25px;color: #333;text-decoration: none;}\naCssPage:hover{font-family: Arial, Helvetica, sans-serif;font-size: 12px;line-height: 25px;color: #ff0000;text-decoration: underline;}\n</style>\n";

i_pagerString_ENG = i_pagerString_ENG + "<style type=\"text/css\">\nCssPage {font-family: Arial, Helvetica, sans-serif;font-size: 12px;line-height: 25px;color: #333;text-decoration: none;}\naCssPage:hover{font-family: Arial, Helvetica, sans-serif;font-size: 12px;line-height: 25px;color: #ff0000;text-decoration: underline;}\n</style>\n";

if (i_pagesize != 0)

{

i_Pcount = (i_RecordCount / i_pagesize);

i_Pcount = ((i_RecordCount % i_pagesize) != 0 i_Pcount + 1 : i_Pcount);

i_Pcount = (i_Pcount == 0 1 : i_Pcount);

}

if (i_pageIndex <= 0) i_pageIndex = 1;

if (i_pageIndex > i_Pcount) i_pageIndex = i_Pcount;

i_StartPageNum = 1;

while (i_StartPageNum + 10 <= i_pageIndex)

{

i_StartPageNum = i_StartPageNum + 10;

}

i_EndPageNum = i_StartPageNum + 9;

if (i_EndPageNum > i_Pcount) i_EndPageNum = i_Pcount;

i_pagerString = i_pagerString + "<div class='" + i_CssClass + "' style='padding-left:20px;padding-right:20px'>共<b>" + i_Pcount + "</b>页 共有<b>" + i_RecordCount + "</b>记录 第<b>" + i_pageIndex + "</b>页 跳到第 [ ";

if (i_RecordCount <= ConvertToInt32((i_pageIndex) i_pagesize))

{

i_pagerString_ENG = i_pagerString_ENG + "<div class='" + i_CssClass + "' style='padding-left:20px;padding-right:20px;float:right'><div style='float:left;padding-right:60px'>Total " + i_RecordCount + " , " + ((i_pageIndex - 1) i_pagesize + 1) + "-" + i_RecordCount + " of " + i_RecordCount + " Records </div><div style='float:left;padding-left:60px'>";

}

else

{

i_pagerString_ENG = i_pagerString_ENG + "<div class='" + i_CssClass + "' style='padding-left:20px;padding-right:20px;float:right'><div style='float:left;padding-right:60px'>Total " + i_RecordCount + " , " + ((i_pageIndex - 1) i_pagesize + 1) + "-" + ((i_pageIndex) i_pagesize) + " of " + i_RecordCount + " Records </div><div style='float:left;padding-left:60px'>";

}

if (i_pageIndex != 1)

{

//i_pagerString = i_pagerString + "<a class='" + i_CssClass + "' href='" + i_PID + "page=1'> 首页</a> <a class='" + i_CssClass + "' href='" + i_PID + "page=" + (i_pageIndex - 1)ToString() + "'>上一页</a>";

i_pagerString_ENG = i_pagerString_ENG + "<a class='" + i_CssClass + "' href='" + i_PID + "page=1'> First</a> <a class='" + i_CssClass + "' href='" + i_PID + "page=" + (i_pageIndex - 1)ToString() + "'>Prev</a> ";

}

i_pagerString_ENG = i_pagerString_ENG + " [ ";

if (i_StartPageNum > 1)

{

i_pagerString = i_pagerString + "<a class='" + i_CssClass + "' href='" + i_PID + "page=" + (i_StartPageNum - 1)ToString() + "' title='前十页'><font face='webdings'>7</font></a>";

i_pagerString_ENG = i_pagerString_ENG + " <a class='" + i_CssClass + "' href='" + i_PID + "page=" + (i_StartPageNum - 1)ToString() + "' title='Prev Ten'><font face='webdings'>7</font></a>";

}

for (int i_i = i_StartPageNum; i_i <= i_EndPageNum; i_i++)

{

if (i_i != i_pageIndex)

{

i_pagerString = i_pagerString + "<a class='" + i_CssClass + "' href='" + i_PID + "page=" + i_iToString() + "'>" + i_iToString() + "</a> ";

i_pagerString_ENG = i_pagerString_ENG + "<a class='" + i_CssClass + "' href='" + i_PID + "page=" + i_iToString() + "'>" + i_iToString() + "</a> ";

}

else

{

i_pagerString = i_pagerString + "<b><font color=red>" + i_iToString() + "</font></b> ";

i_pagerString_ENG = i_pagerString_ENG + "<b><font color=red>" + i_iToString() + "</font></b> ";

}

}

if (i_EndPageNum < i_Pcount)

{

i_pagerString = i_pagerString + "<a class='" + i_CssClass + "' href='" + i_PID + "page=" + (i_EndPageNum + 1)ToString() + "' title='下十页'><font face='webdings'>8</font></a>";

i_pagerString_ENG = i_pagerString_ENG + "<a class='" + i_CssClass + "' href='" + i_PID + "page=" + (i_EndPageNum + 1)ToString() + "' title='Next Ten'><font face='webdings'>8</font></a>";

}

i_pagerString = i_pagerString + "] 页";

i_pagerString_ENG = i_pagerString_ENG + "] ";

if (i_pageIndex != 1)

{

i_pagerString = i_pagerString + "<a class='" + i_CssClass + "' href='" + i_PID + "page=1'> 首页</a> <a class='" + i_CssClass + "' href='" + i_PID + "page=" + (i_pageIndex - 1)ToString() + "'>上一页</a>";

//i_pagerString_ENG = i_pagerString_ENG + "<a class='" + i_CssClass + "' href='" + i_PID + "page=1'> 首页</a> <a class='" + i_CssClass + "' href='" + i_PID + "page=" + (i_pageIndex - 1)ToString() + "'>上一页</a>";

}

if (i_Pcount != i_pageIndex)

{

i_pagerString = i_pagerString + "<a class='" + i_CssClass + "' href='" + i_PID + "page=" + (i_pageIndex + 1)ToString() + "'> 下一页</a> <a class='" + i_CssClass + "' href='" + i_PID + "page=" + i_Pcount + "'>尾页</a>";

i_pagerString_ENG = i_pagerString_ENG + "<a class='" + i_CssClass + "' href='" + i_PID + "page=" + (i_pageIndex + 1)ToString() + "'> Next</a> <a class='" + i_CssClass + "' href='" + i_PID + "page=" + i_Pcount + "'>End</a>";

}

i_pagerString = i_pagerString + "</div>";

i_pagerString_ENG = i_pagerString_ENG + "</div></div>";

if (_Language == MyEnumLanguageEnglish)

{

return i_pagerString_ENG;

}

else

{

return i_pagerString;

}

}

//将HTML代码加入输出流

protected override void Render(HtmlTextWriter output)

{

baseRender(output);

switch (_DisplayPageing)

{

case MyEnumAlways:

outputWriteLine(ThePage(_recordcount, _pageSize, _pageIndex, _PID, _CssClass));

break;

case MyEnumAuto:

if (_pageSize < _recordcount)

{

outputWriteLine(ThePage(_recordcount, _pageSize, _pageIndex, _PID, _CssClass));

}

else

{

outputWriteLine("");

}

break;

case MyEnumNever:

outputWriteLine("");

break;

}

//if (_DisplayPageing == true) outputWriteLine(ThePage(_recordcount, _pageSize, _pageIndex, _PID, _CssClass));

// outputWriteLine(ThePage(_recordcount, _pageSize, _pageIndex, _PID, _CssClass));

}

}

}

组件和控件的区别:

1、Component在Run Time时不能呈现UI,而Control可以在Run Time时呈现UI(但是vs 2005里的aspnet中的SqlDataSource是Control,但是它不能呈现UI)。

2、Component是贴在容器Container上的,而Control则是贴在Windows Form或者Web Form上的。

举例来说,SqlCommand是个Component,DataGrid则是一个Control。

类:

如果您的类使用外部资源但不用于设计图面,则实现 SystemIDisposable,或者从直接或间接实现 IDisposable 的类派生。

如果您的类要用于设计图面(如 Windows 窗体或 Web 窗体设计器),则实现 SystemComponentModelIComponent,或者从直接或间接实现 IComponent 的类派生。请注意,IComponent 扩展 IDisposable,因此 IComponent 类型始终是IDisposable 类型。与不是 IComponent 的 IDisposable 类型相比,IComponent 类型的性能系统开销要小。但这一不足通常可由在设计时和运行时安置 IComponent的能力来弥补。(在本主题的后面部分将对该安置功能进行说明)。

如果希望类可设计(在设计图面上使用)并且可按引用封送,可从 SystemComponentModelComponent 派生。Component 是按引用封送的 IComponent 类型的基实现。

如果希望可设计的类可按值封送,可从 SystemComponentModelMarshalByValueComponent 派生。MarshalByValueComponent 是按值封送的 IComponent 类型的基实现。

如果希望向对象模型层次中引入 IComponent 类型,但由于单次继承的原因而不能从 Component 或 MarshalByValueComponent 之类的基派生,请实现IComponent。

如果需要提供用户界面的可设计类,则该类是控件。控件必须直接或间接从下列基控件类之一派生:SystemWindowsFormsControl 或 SystemWebUIControl。

注意

如果您的类既不是可设计类,也不保存外部资源,则不需要 IComponent 或 IDisposable 类型。

下面是组件、控件、容器和站点的定义。

组件

在 NET Framework 中,组件是指实现 SystemComponentModelIComponent 接口的一个类,或从实现 IComponent 的类中直接或间接派生的类。在编程中,“组件”这个术语通常用于可重复使用并且可以和其他对象进行交互的对象。NET Framework 组件满足这些一般要求,另外还提供诸如控制外部资源和设计时支持等功能。

控制外部资源

IComponent 接口扩展 IDisposable 接口,后者在其协定中有一个名为 Dispose 的方法。在其 Dispose 方法实现中,组件必须显式释放外部资源。与垃圾回收过程中发生的默认、不确定的清理相比,这提供了一个确定的方法来释放资源。开发人员必须在整个包容层次结构中传播 Dispose以确保组件的子级同时释放资源。另外,派生的组件必须调用其基类的Dispose 方法。

注意

即使通过 Dispose 提供对资源的显式控制,也应该始终通过终结器(析构函数)提供隐式清理,以防用户未能对您的组件调用 Dispose 时资源永久泄漏。

下面的示例显示了在基组件和在派生的组件中实现 Dispose 的方式。

C#

public class BaseComponent : IComponent {

// IComponent extends IDisposable

public void Dispose() {

Dispose(true);

GCSuppressFinalize(this);

}

protected virtual void Dispose(bool disposing) {

if (disposing) {

// Free other state (managed objects)

}

// Free your own state (unmanaged objects)

}

// Simply call Dispose(false)

~BaseComponent(){

Dispose (false);

}

}

// Derived component

public class DerivedComponent : BaseComponent {

protected override void Dispose(bool disposing) {

if (disposing) {

// Free other state

}

// You must invoke the Dispose method of the base class

baseDispose(disposing);

// Free your own state

}

// No finalizer/destructor

// No Dispose() method

}

设计时支持

在 NET Framework 中,组件的一个重要功能就是它们是可设计的,这意味着作为组件的类可用于快速应用程序开发 (RAD) 环境(如 Visual Studio)中。可将组件添加到 Visual Studio 的工具箱中,也可将组件拖放到某个窗体上,还可以在设计图面上对组件进行操作。请注意,对 IComponent 类型的基本设计时支持已经内置于 NET Framework 中;组件开发人员无须进行额外的工作就可利用基本设计时功能。

有关设计时支持的更多信息,请参见组件的设计时属性 (Attribute) 和扩展设计时支持。

承载组件

组件可以被放置(承载)在一个容器(本主题稍后部分进行了定义)中。当组件被放置后,它通过其站点(本主题稍后部分进行了定义)与容器进行交互并能够通过站点从其容器查询并得到服务。为了确保容器拆卸后资源被释放,容器必须实现 IDisposable 接口。在其 Dispose 方法的实现中,容器必须释放它保留的所有资源,并调用它包含的每个组件的 Dispose 方法。

包容是逻辑上的,不需要可视的表示形式。放置数据库组件的中间层容器就是非可视包容的一个示例。可在 Visual Studio 的 Windows 窗体设计器和 Web 窗体设计器中找到可视包容。可视化设计图面是承载窗体组件(Web 窗体中的页组件)的容器。

封送组件

组件可以是可远程控制的或不可远程控制的。可远程控制的组件由引用或值进行封送。封送涉及跨边界(如应用程序域(轻量进程)、进程、甚至是计算机)发送对象。当对象由引用封送时,会创建一个代理对该对象进行远程调用。当对象由值进行封送时,跨相关边界发送该对象的一个序列化的副本。

以下可远程控制的组件应该由引用封送:封装系统资源的可远程控制组件,较大的可远程控制组件或作为单个实例存在的可远程控制组件。由引用封送的组件的基类是SystemComponentModelComponent。该基类实现 IComponent 并从 MarshalByRefObject 派生。NET Framework 类库中的许多组件从 Component 派生,包括SystemWindowsFormsControl(Windows 窗体控件的基类)、SystemWebServicesWebService(使用 ASPNET 创建的 XML Web 服务的基类)和SystemTimersTimer(生成递归事件的类)。

仅保留状态的可远程控制组件应该由值封送。由值封送的组件的基类是 SystemComponentModelMarshalByValueComponent。该基类实现 IComponent 并从 Object 派生。NET Framework 类库中只有少量组件从 MarshalByValueComponent 派生。所有此类组件都在 SystemData 命名空间中(DataColumn、DataSet、DataTable、DataView 和 DataViewManager)。

注意

按值和按引用封送的对象的基类分别是 Object 和 MarshalByRefObject,但对应的派生类名为 MarshalByValueComponent 和 Component。命名方案背后的逻辑是越常用的类型,其名称就越简单。

如果不对组件进行远程控制,则不要从 Component 的基实现派生,而应直接实现 IComponent。

有关对象远程控制的更多信息,请参见 NET 远程处理概述。

控件

控件是提供(或实现)用户界面 (UI) 功能的组件。NET Framework 为控件提供两个基类:一个用于客户端 Windows 窗体控件,另一个用于 ASPNET 服务器控件。它们是SystemWindowsFormsControl 和 SystemWebUIControl。NET Framework 类库中的所有控件直接或间接从这两个类派生。SystemWindowsFormsControl 从Component 派生,本身提供 UI 功能。SystemWebUIControl 实现 IComponent 并提供可在其上轻松添加 UI 功能的基础结构。

注意

每个控件都是一个组件,但并不是每个组件都是控件。

在net环境下编写Windows Form 控件非常的简单,只要直接和间接继承与SystemWindowsFormsControl即可,Control类为我们提供了很多高级的特性,如:窗口句柄、管理消息、鼠标和键盘事件、可视化属性(Color、Size、Position)、安全和线程支持等等,有了这些高级的特性,我们编写Windows Form 控件就简单的多,同时我们也可以把更多的精力放在我们应该关注的地方,如UI如何画、数据的Binding和显示

在net下编写Windows Form 控件有三种方式,从SystemWindowsFormsControl派生的自定义控件、从已有的控件派生(如SystemWindowsFormsTextBox)的扩展控件、从SystemWindowsFormsUserControl派生的组合控件,很多的朋友都分不清楚UserControl和Control之间的区别,不知道到底从哪个类进行派生,简单的说:UserControl比Control更高级,提供了更多的高级特性,Control 类只提供控件所需的所有基本功能(包括鼠标和键盘处理事件),但不提供可视化的UI,所以说从Control派生的话,用户必须override OnPaint,UserControl相比Control为我们提供了更多的特性,但是UserControl也就失去了更多的灵活性

组件和控件的设计时考虑:

Designer顾名思义就是为Component设计时服务的,Designer可以在设计时修改组件的行为,还可以提供它自己的服务和行为。

在net里要为Control或者Component定制Designer,只要从IDesigner继承下来即可,但是在net里ms已经帮我们做了两个从IDesigner继承下来的基类,ComponentDesigner和ControlDesigner,ComponentDesigner是为Component而设计的,ControlDesigner是为Control而设计的,所以我们可以直接从ComponentDesigner继承。

Designer可以提供右键快捷菜单上的菜单命令,我们可以通过实现ComponentDesigner 谓词(Verbs) 属性来定义 get 访问器,该访问器返回的 DesignerVerbCollection 中包含用于生成菜单命令的 DesignerVerb 对象。同时我们对组件被双击时定制默认操作,在Component Designer实现 DoDefaultAction 方法即可

组件的文档设计器

每个Component不但是有Component Designer,而且还有Component DocumentDesigner,但这两个Designer之间到底有什么样的区别呢?我用比较通俗的讲法来给大家区别下,Component Designer是指一个Component被拖放到Form或者Page的Container上时所呈现出来的UI设计器(图1);Component DocumentDesigner则是指Component本身根文档设计器(图2)

12

容器和站点

如果您正在为 Windows 窗体或 Web 窗体页(ASPNET 页)开发组件和控件,则不需要实现容器或站点。Windows 窗体和 Web 窗体的设计器就是 Windows 窗体和 ASPNET 服务器控件的容器。容器向放置在其中的组件和控件提供服务。在设计时,控件放置在设计器中并从设计器获得服务。为了保持完整性,以下给出了容器和站点的定义。

Container

容器是一个实现 SystemComponentModelIContainer 接口的类,或从实现该接口的类派生的类。容器在逻辑上包含一个或多个组件,这些组件叫做容器的子组件。

Site

站点是一个实现 SystemComponentModelISite 接口的类,或从实现该接口的类派生的类。站点由容器提供,用来管理其子组件及与子组件进行通信。通常,容器和站点作为一个单元来实现。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » .NET的.NET控件

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情