【转】用户控件和自定义控件的区别

test:一.如果现有的 ASP.NET 服务器控件都不符合应用程序的特定要求,则可以创建封装所需功能的 Web 用户控件或 Web 自定义控件。这两种控件之间的主要区别在于设计时的易创建性与易用性。

Web 用户控件易于创建,但它们在高级方案中使用起来可能不太方便。开发 Web 用户控件的方式与开发 Web 窗体页的方式几乎完全相同。与 Web 窗体相似,用户控件可以在可视化设计器中创建,可以使用与 HTML 隔离的代码来编写,并且可以处理执行事件。但是,由于 Web 用户控件在运行时动态地进行编译,所以不能将它们添加到工具箱中,而且它们在添加到页面上时由简单的占位符标志符号来表示。如果您习惯于完全的 Visual Studio .NET 设计时支持(包括“属性”窗口和“设计”视图预览),这将会使 Web 用户控件使用起来更不方便。 此外,在应用程序之间共享用户控件的唯一方式是将一个单独的副本放入每个应用程序,因此如果对该控件作出了更改,将需要进行比较多的维护。

Web 自定义控件是编译的代码,这使得 Web 自定义控件更易于使用但更难于创建;Web 自定义控件必须使用代码来创建。一旦创建该控件,那么,您就可以将其添加到工具箱中,并在具有完全“属性”窗口支持和 ASP.NET 服务器控件的其他所有设计时功能的可视化设计器中显示该控件。此外,还可以在全局程序集缓存中安装 Web 自定义控件的单个副本,并在应用程序之间共享该副本,这将使维护变得更容易。有关更多信息,请参阅全局程序集缓存。
如果您的控件包含大量静态布局,用户控件则可能是较佳的选择。如果您的控件主要是动态生成的(例如数据绑定表的行、树视图的节点或选项卡 (TabControl) 控件的选项卡),自定义控件则可能是较佳的选择。

下表概述了这两种类型之间的主要区别:
Web 用户控件
1.易于创建
2.为使用可视化设计工具的使用者提供有限的支持
3. 每个应用程序中需要控件的一个单独副本
4. 不能添加到 Visual Studio 中的工具箱
5. 适用于静态布局
Web 自定义控件
1.难于创建
2. 为使用者提供完全的可视化设计工具支持
3. 仅在全局程序集缓存中需要控件的单个副本
4. 可以添加到 Visual Studio 中的工具箱
5. 适用于动态布局

 

二:

用户控件(UserControl) : *.ascx是指页面中加载的功能块
自定义控件,WebControl也属性它类: 可以放到工具栏里面,直接拖过来用
自定义控件是指编译
后直接可以放到工具箱中用,就像TextBox,DataGrid一样
在设计器中可以用鼠标拖动实现
用户控件是页面的功能单位,*.ascx,我公司就几个*.aspx
页面,其余都是用*.ascx嵌入到*.aspx页面中实现的
用法:
自定义服务器控件分为两种:
一种是用*.aspx代码和*.cs代码结合实现
另一种是只用*.cs实现
具体方法:
1. 比如将一个Button从设计器拖到页面中,
对按钮大小或颜色或文本设置一个固定值,保存文件名为: a.cs
2. csc /r:System.dll /t:library/out:http://www.cnblogs.com/A.dll a.cs

三.

1)、用户控件和自定义控件的主要区别在于设计时的易创造性与易用性。
用户控件易于创建,为使用可视化设计工具的使用者提供有限的支持,每个应用程序中需要控件的一个单独副本,不能添加到visual studio工具箱中,适用于静态布局,它们在高级方案中使用起来可能不太方便。
自定义服务器控件是经过编译的代码,这使其易于使用但难于创建。它为使用者提供完全的可视化设计工具支持,仅在全局程序集缓存中需要控件的单个副本,可以添加到visual studio中的工具箱,适用于动态布局。
如果您的控件包含大量静态布局,用户控件则可能是较佳的选择。如果您的控件主要是动态生成的,自定义控件则是较佳的选择。

2)、(1)用户控件和自定义控件概述
用户控件(UserControl): 扩展名为*.ascx,跟*.aspx在结构上相似,是指页面中 加载的功能块,只是用户控件不能单独作为页面运行,必须嵌入到*.aspx页面或其它用户控件中使用.
自定义控件,跟HtmlControl或WebControl相似,编译后可以添加引用到工具栏里面,直接用鼠标拖动使用.

(2)使用
在一个大系统中,有时候会只能几个*.aspx页面,其余的都是做成*.ascx页面,
这样可以增强页面之间的藕合性,一个用户控件*.ascx都作为一个独立的功能块.
自定义控件是指编译后直接可以放到工具箱中用,就像TextBox,DataGrid一样
在设计器中可以用鼠标拖动到页面上使用.
自定义服务器控件分为两种:
1.一种是用*.aspx代码和*.cs代码编译后生成DLL,再添加引用到工具箱使用.
一般用于WebForm中.
2.另一种是只用*.cs实现,再编译生成DLL,添加到工具箱使用.
一般用于WinForm中.
自定义控件生成步骤:
比如:
1. 将一个Button从设计器拖到页面中,
对按钮大小,颜色或文本设置一个固定值,保存文件名为: a.cs
2. csc /r:System.dll /t:library/out:http://www.cnblogs.com/A.dll a.cs
3. 右击工具箱空白处,弹出右击菜单后,选“添加移除项”,将刚生成的DLL
添加到工具箱里面来,这样,就可以像一般的Button一样拖动使用了

3)、(1)用户控件用.ascx文件表示,在"添加新项"中点击"vveb用户控件".它不是编译代码,编译随网页动态的进行

 


自定义控件在dll文件中表示,它是编译代码。在“新建项目”的模块中点击“web控件库”,用户控件不会出现在工具箱中,而自定义控件会出现在工具箱中。

用户控件支持缓存,而自定义控件不支持缓存。

用户控件会对使用可视化设计的用户提供有限的支持,而自定义控件会提供全面的支持。

用户控件可以在一个应用程序中重用,但不能跨应用程序重用。

自定义用户就可以跨应用程序使用,它放在被称为全局程序集缓存的中央库中,以便那台服务器上的所有应用程序都可以使用它。

用户控件不能独立存在和使用,它要求用asp.net页面作为容器。

下面是一个login用户控件的示例

public partial class Login : System.Web.UI.UserControl
{
protected SqlConnection conn;
protected SqlCommand cmd;
protected SqlDataReader dr;

/// <summary>
/// Txtusername是用户控件的属性,要想在aspx访问它必须先封装起来为public才行
/// </summary>
public string Txtusername
{
get { return this.TextBox1.Text; }
set { this.TextBox1.Text = value; }
}

protected void Page_Load(object sender, EventArgs e)
{

}

protected void Button1_Click1(object sender, EventArgs e)
{
string strname = this.TextBox1.Text.Trim();
string strpwd = this.TextBox2.Text.Trim();
//根据指定的密码利用哈希算法转换成一个MD5的哈希密码
//this.Response.Write(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(strpwd, "MD5"));

conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["DBuserConnectionString"].ToString());
conn.Open();
cmd = new SqlCommand("select * from userdetails where username=@username and userpwd=@userpwd", conn);//System.Web.Configuration.FormsAuthPasswordFormat.MD5
cmd.Parameters.Add(new SqlParameter("@username", strname));
//注意如果数据库里的密码是加密的话,在这里根据条件查询赋值前也得MD5加密才是
cmd.Parameters.Add(new SqlParameter("@userpwd", System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(strpwd, "MD5")));
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
//前进下一条记录
if (dr.Read())
{
//状态管理,在asp.net中默认的状态是用cookie保存的
//在用户每次登陆成功时就把用户保存到Cookie中,并用一个复选框来管理用户是否多长时间保存状态
HttpCookie cookie = new HttpCookie("username", strname);

if (this.CheckBox1.Checked)
{
//设置cookie的过期日期
cookie.Expires = DateTime.Now.AddMonths(1);
//响应后添加到cookies集合里
this.Response.Cookies.Add(cookie);
}
//过3秒后自动跳转页面,相当于html的mate标签
this.Response.AppendHeader("refresh", "3;url=DataListDemo1.aspx");
}
else
{
this.Response.Write("username or password are wrong!");
}
conn.Close();
}
}

 

四.

本文将详细讲解一个简单的自定义服务器控件的创建过程。通过这些内容,读者将了解利用Visual Studio 2005,创建和测试自定义服务器控件的基本方法。

  注意:本文内容基于ASP.NET 2.0技术撰写,示例应用程序使用Visual Studio 2005进行开发。

  创建一个简单的自定义服务器控件

  创建自定义服务器控件的过程包括:

  (1)创建一个测试用Web站点应用程序;

  (2)为新建站点应用程序,新增一个Web控件库项目;

  (3)编写、编译和测试自定义服务器控件。

  (1)创建一个测试用Web站点应用程序

  利用Visual Studio 2005,创建Web站点应用程序的方法很多,例如,在本地文件系统中创建、在IIS支持下创建、在FTP站点中创建、在远程站点中创建等等。然而,无论如何,开发人员都应首先打开Visual Studio 2005,然后,单击"文件"菜单下"新建网站..."项目。这时,将弹出如下图1的对话框。

 

  图1 新建网站对话框

  图1是新建网站对话框。在该对话框中,开发人员需要选择创建模板,位置、编程语言。如图1所示,示例采用了ASP.NET网站模板,文件系统和C#编程语言来创建。当单击"确定"按钮之后,Visual Studio 2005将在本机D:AppTest下创建一个test1文件夹。所有应用程序文件都存储在文件夹内。默认情况下,test1文件夹内包括一个空的用于存储应用程序数据文件的App_Data文件夹,同时还分别包括一个Default.aspx和Default.aspx.cs文件。

  通过以上步骤就创建了一个Web站点应用程序。该Web站点将用于测试所创建的Web自定义服务器控件。

  (2)新增自定义服务器控件项目

  在创建Web站点应用程序之后,开发人员还必须在当前站点项目中,添加一个自定义服务器控件项目,也就是Web控件库项目。实现方法是:在打开Web站点应用程序的前提下,单击"文件"菜单中"添加"项的子项"新建项目"。此时,Visual Studio 2005将弹出如图2的对话框。

 

  图2 添加新项目对话框

  图2是添加新项目对话框截图。该对话框分为三个设置部分:项目类型、模板、名称和位置。

  在对话框左侧有一个树形列表,其中包括各种项目类型。为创建Web控件库项目,应选择"Visual C#"节点的子节点"Windows"。此时,对话框右侧将出现该子节点对应的已安装模板,其中包括Windows应用程序、类库、Web控件库等。开发人员应选中"Web控件库"一项。最后,需要设置Web控件库项目的名称和位置。为了便于管理,建议将Web控件库项目和测试站点项目存储在同一文件夹内,因此,本例将名称设置为"HelloMyControl",将位置设置为D:AppTest  est1。当单击"确定"按钮之后,Visual Studio 2005将在D:AppTest  est1目录下,自动创建一个HelloMyControl用于存储Web控件库相关文件。同时,Visual Studio 2005的"解决方案资源管理器"将显示如图3所示内容。

 

  图3 解决方案资源管理器

  如图3所示,解决方案资源管理器中包括两个项目。一个是前文创建的Web站点项目,另一个是名为HelloMyControl的Web控件库项目,其中默认包括一个WebCustomControl1.cs文件。下面就可以开始编写、编译和测试自定义服务器控件了。

  (3)编写、编译和测试自定义服务器控件

  需要实现的自定义服务器控件WelcomeLabel功能很简单。类似于一个标准Label控件。WelcomeLabel控件从System.Web.UI.WebControls. WebControl继承,其中自定义了一个string类型的Text属性。当控件运行时,将显示Text属性值和当前用户名的组合文字。例如,将Text属性值设置为"您好",那么最终显示的是"您好,某某!"。开发人员可以用WelcomeLabel控件作为站点欢迎页面的一部分。

  WelcomeLabel控件的实现代码包含在WebCustomControl1.cs文件中。该文件源代码如下所示。

using System;
using System.Collections.Generic;
using System.Security.Permissions;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace HelloMyControl
{
 [
AspNetHostingPermission (SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal ),
AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal ),
DefaultProperty ( "Text" ),
ToolboxData ( "<{0}:WelcomeLabel runat="server" > </{0}:WelcomeLabel>")
 ]
 public class WelcomeLabel : WebControl
 {
// 实现Text属性
[
 Bindable(true), Category("Appearance"), DefaultValue(""), Description("文本内容."), Localizable(true)
]
public virtual string Text
{
 get
 {
string s = (string)ViewState["Text"];
return (s == null) ? String.Empty : s;
 }
 set
 {
ViewState["Text"] = value;
 }
}
// 重写RenderContents方法
protected override void RenderContents(HtmlTextWriter writer)
{
 // 对Text属性值编码,并写入输入流中
 writer.WriteEncodedText(Text);
 // 判断Web请求是否有效。如果有效,则设置内容,并写入输出流中
 if (Context != null)
 {
// 获取当前用户名
string s = Context.User.Identity.Name;
// 如果当前用户名不为空,则分析用户名并按照指定格式写入输出流中
if (s != null && s != String.Empty)
{
 string[] split = s.Split('/');
 int n = split.Length - 1;
 if (split[n] != String.Empty)
 {
writer.Write(",");
writer.Write(split[n]);
 }
}
 }
 writer.Write("!");
}
 }
}

 

  代码说明之控件基类:

  如果服务器控件需要呈现用户界面(UI)元素或任何其他客户端可见的元素,则应该从System.Web.UI.WebControls.WebControl(或派生类)派生该控件。如果控件要呈现在客户端浏览器中不可见的元素(如隐藏元素或meta元素),则应从System.Web.UI.Control派生该控件。本例显然需要呈现用户界面元素,因此,自定义服务器控件类WelcomeLabel从WebControl基类继承。由于WebControl类从Control派生,因此,WelcomeLabel控件则自动继承基类提供的成员对象,这些对象多数与用户界面元素呈现有关,例如,Font、ForeColor、BackColor、Width等等。另外,同样也是由于从WebControl继承,因此,WelcomeLabel控件还自动实现ASP.NET 2.0新增的主题和皮肤功能。实际上,由于WelcomeLabel控件与ASP.NET 2.0的内置服务器控件Label有着很多相似之处,因此,从功能实现的角度出发,最好的方式应该是使得WelcomeLabel控件类从Label类继承。然而,本例为了说明定义属性和定义属性元数据的实现方法,因此,从WebControl基类继承。

  代码说明之Text属性:

  如上源代码所示,WelcomeLabel实现了一个Text属性,并使用视图状态存储该属性值。使用视图状态保存回发间的Text值。每次回发时,将重新创建页并从视图状态还原值。如果Text值并未存储在视图状态中,则在每次回发时会将值设置为其默认的Empty。ViewState属性继承自WebControl,是保存数据值的字典。通过使用String键,可输入和检索值。本例中将"Text"用作键。字典中的项被类型化为Object,然后必须将其强制转换为属性类型。

  代码说明之RenderContents方法:

  通常,在从WebControl派生控件并呈现单个元素时,应重写RenderContents方法(而不是Render方法),以呈现控件标记中的内容。在呈现控件及其样式属性的开始标记之后,WebControl的Render方法将调用RenderContents。如果重写Render方法以写入内容,则控件将丢失生成到WebControl的Render方法中的样式呈现

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/z470208239/article/details/6144713

转载于:https://www.cnblogs.com/Miko2012/archive/2012/11/23/2784560.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值