根据需求不同,控件可以是完整的功能模块,也可以是基本元素的扩展或组合
控件可能会接受服务器数据进行显示或者处理,比如报表控件
控件也可能会接受客户端数据用于向服务端提交等等
举个例子,你当前的注册界面很多地方需要输入用户名之类的东西,并需要输入口对其检查并提示
这样的话,你可以吧一个输入框和一个标签(或者DIV)并通过程序设置用户接口以便接收用户对该控件的某些属性的参数(长,高,控件ID,验证表达式 等等)作为很小的控件来使用
需要的时候,把该控件拖到你需要的地方即可
这时候,页面的顶端会出现<@register 这样的语句,这是对该控件的引用而已
水平有限,能想到的就这么多了,希望对你有帮助C#开发当然是以 标准服务器控件为主流~~ 但服务器控件顾名思义 使用时得调用服务器资源,占用资源是肯定的
当可以用HTML控件来代替服务器控件的时候,就最好使用HTML控件,来减少资源使用, 在有些时候, HTML控件适当的加一些javascript脚本,是可以代表服务器控件功能的
例如,验证输入框是否为空,可以用javascript
if(textvalue==""||textvalue==null)
而不是用服务器控件来验证 TextBox1Text==""组件和控件的区别:
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 接口的类,或从实现该接口的类派生的类。站点由容器提供,用来管理其子组件及与子组件进行通信。通常,容器和站点作为一个单元来实现。dropdownlist 指定其autopostback属性为true 就可以了
其实要提交的也不是很多,就是按钮,还有就是选择dropdownlist,这些,并非很多
比如label 这个在aspx里面,你看源代码的时候就没有了,成为字符串了
无论是客户端和服务端运行的标签,他们都有各自的ID和时间,并非只有runat=server的才会在点击以后产生反映
所以有各自不同的ID,服务器端的有runat=server ,他们的相应是IE自己来解决的,就好像用C/C++写的hook,你要截获相应的信息,比如截获空格键,那么你要做的就是截获所有键,是空格的,就产生你设定的消息,不是空格的,当然就放过去,有系统的其他函数
和这个一样,IE发现是一般的标签是一般执行,是服务器的,就去调用相应代码
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)