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" οnclick="buttonUp_Click" />
<asp:Button ID="buttonDown" runat="server" Text="down"
οnclick="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" οnclick="buttonUp_Click" />
<asp:Button ID="buttonDown" runat="server" Text="down"
οnclick="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
轉載于:https://www.cnblogs.com/yuananyun/archive/2010/10/17/1853755.html