1、自定义控件的使用
a)首先我新建立了一个空的解决方案,在解决方案中新建了网站,用于测试自定义的控件;
b)在解决方案中=>添加新项目=>在已安装的模板中选择“Asp.NET服务器控件”,确定后,
默认就会生成一个ServerControl的控件项目,在这个控件项目中就可以添加自定义的控件了。
c)创建一个显示当前日期的自定义控件
代码如下:
view plaincopy to clipboardprint?
namespace ServerControlTest
{
[DefaultProperty("Custom")]
[ToolboxData("<{0}:ShowDate runat=server></{0}:ShowDate>")]
public class ShowDate : WebControl
{
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("Ch")]
[Localizable(true)]
public string Custom
{
get
{
String s = (String)ViewState["Custom"];
return ((s == null) ? "Ch" : s);
}
set
{
ViewState["Custom"] = value;
}
}
protected override void RenderContents(HtmlTextWriter output)
{
string s;
if (Custom.Equals("Ch"))
{
s = DateTime.Now.ToString("D");
string[] x = new string[7] { "周日", "周一", "周二", "周三", "周四", "周五", "周六" };
int n;
n = int.Parse(DateTime.Now.DayOfWeek.ToString("D"));
s += " " + x[n] + " " + string.Format("{0:t}", DateTime.Now);
}
else
{
s = string.Format("{0:R}", DateTime.Now);
}
output.Write(s);
}
}
namespace ServerControlTest
{
[DefaultProperty("Custom")]
[ToolboxData("<{0}:ShowDate runat=server></{0}:ShowDate>")]
public class ShowDate : WebControl
{
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("Ch")]
[Localizable(true)]
public string Custom
{
get
{
String s = (String)ViewState["Custom"];
return ((s == null) ? "Ch" : s);
}
set
{
ViewState["Custom"] = value;
}
}
protected override void RenderContents(HtmlTextWriter output)
{
string s;
if (Custom.Equals("Ch"))
{
s = DateTime.Now.ToString("D");
string[] x = new string[7] { "周日", "周一", "周二", "周三", "周四", "周五", "周六" };
int n;
n = int.Parse(DateTime.Now.DayOfWeek.ToString("D"));
s += " " + x[n] + " " + string.Format("{0:t}", DateTime.Now);
}
else
{
s = string.Format("{0:R}", DateTime.Now);
}
output.Write(s);
}
}
这样自定义的控件创建完毕。
d)将自定义的控件添加到工具箱中
点击工具箱中的“选择项”=>在弹出的对话框中选择“浏览”=>选择刚才编译好的dll文件,
这时会在.Net Framework组件中添加上已选的dll,点确定后就会将自定义的控件添加到工具箱中。
e)在web页面中直接使用自定义的控件
view plaincopy to clipboardprint?
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register Assembly="ServerControlTest" Namespace="ServerControlTest" TagPrefix="cc2" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<cc2:ShowDate ID="ShowDate1" runat="server" />
</div>
</form>
</body>
</html>
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register Assembly="ServerControlTest" Namespace="ServerControlTest" TagPrefix="cc2" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<cc2:ShowDate ID="ShowDate1" runat="server" />
</div>
</form>
</body>
</html>
和使用Label控件一样,直接从工具栏中将自定义的控件拖动到web页面中即可。
在web中显示的结果如下:
f)注意:在Web项目中使用自定义控件时,最好是添加对自定义控件的引用,如果添加了引用,
当自定义控件修改编译后,Web项目中的控件也会自动的修改。
2、用户控件的使用
a)用户控件声明性语法与用于创建 ASP.NET 网页的语法非常相似。主要的差别在于:用户控件使用 @ Control 指令取代了 @ Page 指令,并且用户控件在内容周围不包括 html 、body 和 form 元素。
b)在Web项目中=>添加新项=>选择Web用户控件,确定后新的用户控件生成。
c)生成的.ascx控件和.aspx页面一样
添加的代码如下:
view plaincopy to clipboardprint?
后台代码WebUserControl.ascx.cs如下:
public partial class WebUserControl : System.Web.UI.UserControl
{
private int m_minValue;
private int m_maxValue = 100;
private int m_currentNumber = 0;
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
m_currentNumber =
Int16.Parse(ViewState["currentNumber"].ToString());
}
else
{
m_currentNumber = this.MinValue;
}
DisplayNumber();
}
public int MinValue
{
get
{
return m_minValue;
}
set
{
if (value >= this.MaxValue)
{
throw new Exception("MinValue must be less than MaxValue.");
}
else
{
m_minValue = value;
}
}
}
public int MaxValue
{
get
{
return m_maxValue;
}
set
{
if (value <= this.MinValue)
{
throw new
Exception("MaxValue must be greater than MinValue.");
}
else
{
m_maxValue = value;
}
}
}
public int CurrentNumber
{
get
{
return m_currentNumber;
}
}
protected void DisplayNumber()
{
textNumber.Text = this.CurrentNumber.ToString();
ViewState["currentNumber"] = this.CurrentNumber.ToString();
}
protected void buttonUp_Click(Object sender, EventArgs e)
{
if (m_currentNumber == this.MaxValue)
{
m_currentNumber = this.MinValue;
}
else
{
m_currentNumber += 1;
}
DisplayNumber();
}
protected void buttonDown_Click(Object sender, EventArgs e)
{
if (m_currentNumber == this.MinValue)
{
m_currentNumber = this.MaxValue;
}
else
{
m_currentNumber -= 1;
}
DisplayNumber();
}
}
后台代码WebUserControl.ascx.cs如下:
public partial class WebUserControl : System.Web.UI.UserControl
{
private int m_minValue;
private int m_maxValue = 100;
private int m_currentNumber = 0;
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
m_currentNumber =
Int16.Parse(ViewState["currentNumber"].ToString());
}
else
{
m_currentNumber = this.MinValue;
}
DisplayNumber();
}
public int MinValue
{
get
{
return m_minValue;
}
set
{
if (value >= this.MaxValue)
{
throw new Exception("MinValue must be less than MaxValue.");
}
else
{
m_minValue = value;
}
}
}
public int MaxValue
{
get
{
return m_maxValue;
}
set
{
if (value <= this.MinValue)
{
throw new
Exception("MaxValue must be greater than MinValue.");
}
else
{
m_maxValue = value;
}
}
}
public int CurrentNumber
{
get
{
return m_currentNumber;
}
}
protected void DisplayNumber()
{
textNumber.Text = this.CurrentNumber.ToString();
ViewState["currentNumber"] = this.CurrentNumber.ToString();
}
protected void buttonUp_Click(Object sender, EventArgs e)
{
if (m_currentNumber == this.MaxValue)
{
m_currentNumber = this.MinValue;
}
else
{
m_currentNumber += 1;
}
DisplayNumber();
}
protected void buttonDown_Click(Object sender, EventArgs e)
{
if (m_currentNumber == this.MinValue)
{
m_currentNumber = this.MaxValue;
}
else
{
m_currentNumber -= 1;
}
DisplayNumber();
}
}
前台代码如下:
view plaincopy to clipboardprint?
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs" Inherits="WebUserControl" %>
<asp:TextBox ID="textNumber" runat="server" ReadOnly="true" Enabled="false"></asp:TextBox>
<asp:Button ID="buttonUp" runat="server" Text="up" onclick="buttonUp_Click" />
<asp:Button ID="buttonDown" runat="server" Text="down"
onclick="buttonDown_Click" />
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs" Inherits="WebUserControl" %>
<asp:TextBox ID="textNumber" runat="server" ReadOnly="true" Enabled="false"></asp:TextBox>
<asp:Button ID="buttonUp" runat="server" Text="up" onclick="buttonUp_Click" />
<asp:Button ID="buttonDown" runat="server" Text="down"
onclick="buttonDown_Click" />
这样一个用户控件创建完毕。
d)使用用户控件
view plaincopy to clipboardprint?
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register Assembly="ServerControlTest" Namespace="ServerControlTest" TagPrefix="cc2" %>
<%@ Register Src="~/WebUserControl.ascx" TagName="WebUserControl" TagPrefix="wuc" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<cc2:ShowDate ID="ShowDate1" runat="server" />
<wuc:WebUserControl ID="webId" runat="server" />
</div>
</form>
</body>
</html>
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register Assembly="ServerControlTest" Namespace="ServerControlTest" TagPrefix="cc2" %>
<%@ Register Src="~/WebUserControl.ascx" TagName="WebUserControl" TagPrefix="wuc" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<cc2:ShowDate ID="ShowDate1" runat="server" />
<wuc:WebUserControl ID="webId" runat="server" />
</div>
</form>
</body>
</html>
显示的页面如下:
3、自定义控件和用户控件的区别
a)用户控件易于创建,为使用可视化设计工具的使用者提供有限的支持,每个应用程序中需要控件的一个单独副本,不能添加到visual studio 工具箱中,适用于静态布局,它们在高级方案中使用起来可能不太方便。
自定义服务器控件是经过编译的代码,这使其易于使用但难于创建。它为使用者提供完全的可视化设计工具支持,仅在全局程序集缓存中需要控件的单个副本,可以添加到visual studio 中的工具箱,适用于动态布局。
如果您的控件包含大量静态布局,用户控件则可能是较佳的选择。如果您的控件主要是动态生成的,自定义控件则是较佳的选择。
b) 用户控件(UserControl): 扩展名为*.ascx,跟*.aspx在结构上相似,是指页面中 加载的功能块,只是用户控件不能单独作为页面运行,必须嵌入到*.aspx页面或其它用户控件中使用.
自定义控件,跟HtmlControl或WebControl相似,编译后可以添加引用到工具栏里面,直接用鼠标拖动使用.
4、 控件的呈现方法(Rendering)的内核
参照:http://blog.csdn.net/21aspnet/archive/2005/03/12/318347.aspx
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wl_ldy/archive/2010/07/21/5751830.aspx