【轉】用戶控件和自定義控件的區別


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM