開始學習.Net到現在兩年了快,開始學習java 也有大半年了,中間做項目,又開始.Net的學習。這次做.Net項目,背景代碼敲的不是太多,重點放在了UI上,這也是這篇部落格要寫的内容有關,做UI就少不了控件的使用。這次做UI 主要是提取公共,抽象控件。
敲代碼,就離不開控件,那是第一次.Net學習過之後,對于控件的認識很膚淺,通過這次學習,又彌補了對UI控件的認識。這篇部落格要說的是:使用者控件和自定義控件。提到這兩種控件,想必程式設計的孩子們都不陌生,但是談到使用,談到他們的差別,夥伴們清楚嗎?
我們就一起來對比一下這兩種控件:
一、易創造性與易用性
它們的主要差別在于設計時的易創造性與易用性。
1、建立性
使用者控件易于建立,為使用可視化設計工具的使用者提供有限的支援——它可以像編輯普通頁面一樣有可視化編輯環境,也和普通頁面一樣包含頁面部分的.aspx和.cs代碼檔案。
自定義控件沒有可視化編輯,是經過編譯的代碼,這使其易于使用但難于建立。隻能手寫代碼。隻含有一個.cs代碼檔案。
2、易用性
使用者控件開發友善,自定義控件開發比較繁瑣,使用者控件的使用,每個應用程式中需要控件的一個單獨副本,不能添加到visual studio工具箱中,适用于靜态布局,它們在進階方案中使用起來可能不太友善。
自定義控件可以編譯成.DLL檔案,其他項目都可以使用。編譯後可以加載到工具箱中,就像TextBox,DataGrid一樣 在設計器中可以用滑鼠拖動到頁面上使用。自定義控件重用性高,且可以定制個性化的控件,已解決經常使用且現有控件不能完成的任務。
3、使用範圍
自定義控件,它為使用者提供完全的可視化設計工具支援,僅在全局程式集緩存中需要控件的單個副本,可以添加到visual studio中的工具箱,适用于動态布局。
如果您的控件包含大量靜态布局,使用者控件則可能是較佳的選擇。
4、使用
使用者控件(UserControl): 擴充名為*.ascx,跟*.aspx在結構上相似,是指頁面中 加載的功能塊,隻是使用者控件不能單獨作為頁面運作,必須嵌入到*.aspx頁面或其它使用者控件中使用. 它要求用asp.net頁面作為容器。
自定義控件,跟HtmlControl或WebControl相似,編譯後可以添加引用到工具欄裡面,直接用滑鼠拖動使用.
二、使用者控件和自定義控件
1)、自定義伺服器控件
它又分為兩種:
1.一種是用*.aspx代碼和*.cs代碼編譯後生成DLL,再添加引用到工具箱使用.
一般用于WebForm中.
2.另一種是隻用*.cs實作,再編譯生成DLL,添加到工具箱使用.
一般用于WinForm中.
生成步驟:
比如:
1. 将一個Button從設計器拖到頁面中,
對按鈕大小,顔色或文本設定一個固定值,儲存檔案名為: a.cs
2. csc /r:System.dll /t:library/out:../../A.dll a.cs
3. 右擊工具箱空白處,彈出右擊菜單後,選“添加移除項”,将剛生成的DLL 添加到工具箱裡面來,這樣就可以像一般的Button一樣拖動使用了。
2)接下來再看看使用者控件。
使用者控件用.ascx檔案表示,在"添加新項"中點選"web使用者控件".它不是編譯代碼,編譯随網頁動态的進行 。
還有一些特性都是從網上查的,并沒有試驗過,如下:
使用者控件支援緩存,而自定義控件不支援緩存;
使用者控件可以在一個應用程式中重用,但不能跨應用程式重用。
自定義使用者就可以跨應用程式使用,它放在被稱為全局程式集緩存的中央庫中,以便那台伺服器上的所有應用程式都可以使用它。
三、使用者控件的例子
這是别人的一個使用者控件的例子,僅供大家參考。
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 [email protected] and [email protected]", 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();
}
}
總結:最近做的MVC項目,用Html來制作一個公共的頁面,或者半個頁面,這麼看來是自定義控件,其實,使用者控件一直也沒有使用。
不光是.Net,在Java中也應該有類似的概念,通過include包含其他頁面,具體我還不清楚,接下來做java可以翻翻。