天天看點

使用者控件&自定義控件----.Net再學一、易創造性與易用性二、使用者控件和自定義控件

        開始學習.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可以翻翻。