ASP.NET源碼之自定義控件DateTimePicker怎么用

這篇文章給大家分享的是有關(guān)ASP.NET源碼之自定義控件DateTimePicker怎么用的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),龍川網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:龍川等地區(qū)。龍川做網(wǎng)站價(jià)格咨詢:18980820575

ASP.NET源碼之自定義控件DateTimePicker的介紹:寫在前面:要實(shí)現(xiàn)DateTimePicker功能,最簡(jiǎn)單的就是一個(gè)input,旁邊有一個(gè)日歷的小圖標(biāo),加入大量的javascript代碼,然后,點(diǎn)擊日歷后,就出現(xiàn)一個(gè)div用來(lái)選擇日期,選定之后,input就會(huì)出現(xiàn)剛才選定的日期。而input應(yīng)該是只讀的。

ASP.NET源碼之自定義控件DateTimePicker效果圖

ASP.NET源碼之自定義控件DateTimePicker怎么用

標(biāo)記

Register Assembly="DateTimePickerControls" Namespace="DateTimePickerControls" TagPrefix="DTP"
這是寫在aspx頁(yè)上面的,用于引用dll的資源。

對(duì)應(yīng)于源代碼中的命名空間的屬性定義

[assembly: TagPrefix("DateTimePickerControls", "DTP")]

加入工具箱

可以使用下面的方法將自定義的ASP.NET控件加入到工具箱中,如果引入DLL之后,工具箱還不出現(xiàn)控件,可以在工具箱右擊,選擇項(xiàng),然后選擇DLL就一定可以。下面的ToolboxData表現(xiàn)控件的名稱,而Designer表示控件在設(shè)計(jì)界面(DesignMode)中的樣子,注意,必須存在DateTimePickerControls.DateTimePickerDesigner這個(gè)類才出現(xiàn)這句話。而DescriptionAttribute則是描述控件的作用。

[    ToolboxData("<{0}:DateTimePicker runat=server></{0}:DateTimePicker>"),    ValidationPropertyAttribute("Text"),    Designer(typeof(DateTimePickerControls.DateTimePickerDesigner)),    DescriptionAttribute("一個(gè)基于 MSHTML 的 ASP.NET 時(shí)間選擇器。")    ]

ASP.NET源碼之自定義控件DateTimePicker怎么用

繼承

public class DateTimePicker: Control, IPostBackDataHandler, INamingContainer, IPostBackEventHandler

Control 是System.Web.UI空間下面的Control,表現(xiàn)Web控件的類,而IPostBackDataHandler是定義 ASP.NET 服務(wù)器控件為自動(dòng)加載回發(fā)數(shù)據(jù)而必須實(shí)現(xiàn)的方法。也就是,使用_Control.Tex而不是Request.QueryString[“…”]. ToString()或Request.Form[“…”].ToString(),來(lái)獲取Html中的數(shù)據(jù),主要的方法是LoadPostData, RaisePostDataChangedEvent,而INamingContainer和IPostBackEventHandler則暫時(shí)沒(méi)怎么使用。筆者只是參考其它Web控件而把這兩個(gè)接口加上去。

注冊(cè)腳本

注意到每一個(gè)Web自定義控件,都有其對(duì)應(yīng)的Javascript或Vbscript腳本,而且,當(dāng)頁(yè)面上有多個(gè)這樣的控件。不應(yīng)用出現(xiàn)多個(gè)相同腳本。

所以,要使用Page.ClientScript.IsClientScriptBlockRegistered方法來(lái)注冊(cè)腳本。這樣的注冊(cè)腳本,相當(dāng)于有一個(gè)Hashtable來(lái)保存腳本,而每一個(gè)注入的腳本都有一個(gè)Key來(lái)關(guān)聯(lián)。這樣的好處是,在使用多個(gè)腳本時(shí),不會(huì)重復(fù)地寫在頁(yè)面上。

下面的代碼,使用到資源文件中寫好的腳本文件,換句話說(shuō),可以將腳本文件,如Javascript或Vbscript腳本先寫好,然后,直接復(fù)制到

if (!Page.ClientScript.IsClientScriptBlockRegistered("DateTimePickerBaseScript"))  {      ResourceManager manager = new ResourceManager(this.GetType());      string script = manager.GetResourceSet(          System.Globalization.CultureInfo.CurrentCulture, true, true).GetString("DateTimePickerBaseScript");      Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "DateTimePickerBaseScript", script);  }

而.resx文件的源代碼,可以是這樣的:

<root>  <!--其它的資源-->  <data name="DateTimePickerBaseScript">  <![CDATA[  Javascript或VbScript  ]]>  </data>  </root>

在資源文件中寫腳本的優(yōu)點(diǎn)是十分的明顯的,也就是.js的內(nèi)容可以直接復(fù)制并粘貼到這里,而不用再經(jīng)過(guò)處理。

ASP.NET源碼之自定義控件DateTimePicker重寫Control繼承而來(lái)的方法

protected override void OnPreRender(EventArgs e)

protected override void CreateChildControls()

可以將OnPreRender方法當(dāng)成普通Page的OnLoad方法使用,而CreateChildControls方法用于新建子控件,也就是構(gòu)造自定義控件的主要代碼。

獲取Text屬性

   public bool LoadPostData(String postDataKey, NameValueCollection values)     {  string PresentValue = this.ViewStateText;  string PostedValue = values[base.ID];  if (!PresentValue.Equals(PostedValue))  {      this.Text = PostedValue;      return true;  }  else {      return false;  }     }

上面是使用LoadPostData方法來(lái)獲取Text屬性的值。注意,這個(gè)方法有時(shí)候是不運(yùn)行的,這是因?yàn)槟愕腃hildControls中沒(méi)有一個(gè)ID =base.ID的控件,則,必須有一個(gè)子控件的ID為本控件的ID,這里講的子控件,不是指System.Web.UI空間下面的控件,而是指代那些可以在客戶端的瀏覽器中顯示的<input id=””>形式的控件,也就是使用string來(lái)表達(dá)的。正如

WriteTimePicker方法中寫到的"<input type=\"text\" id=\"" + DateTimePickerID。

獲取FormID

可以使用一個(gè)遍歷的過(guò)程,獲取項(xiàng)層控件的ClientID,因?yàn)樵贘s腳本中,服務(wù)器端的ID是用不了的。

設(shè)置DesignMode屬性類

也就是前面所提及的Designer(typeof (DateTimePickerControls.DateTimePickerDesigner)),相對(duì)來(lái)說(shuō),是比較簡(jiǎn)單的,可以說(shuō),你可以參照一個(gè)正確的例子,然后隨便修改一下就可以。需要繼承System.Web.UI.Design.ControlDesigner類,重寫方法 Initialize,GetDesignTimeHtml。而GetDesignTimeHtml就是***顯示在設(shè)計(jì)界面上面的樣子。

ASP.NET源碼之自定義控件DateTimePicker怎么用

設(shè)計(jì)代碼如下:

StringWriter sw = new StringWriter();   HtmlTextWriter htw = new HtmlTextWriter(sw);  HtmlInputText inputText = new HtmlInputText();  inputText.Value = dtp.ID;  inputText.Style.Value = "Width:100px;border-style: none;background-color: #9EBEF5";             inputText.RenderControl(htw);  return sw.ToString();

綜上述得,要定義一個(gè)比較好的自定義控件,首先要有一個(gè)非控件形式的“功能點(diǎn)”使用方法,即上述的時(shí)間選擇功能,要JSP,ASP,ASP.NET中都可以使用的。然后,根據(jù)ASP.NET自定義控件的語(yǔ)法,一步步翻譯就沒(méi)什么問(wèn)題了。

感謝各位的閱讀!關(guān)于“ASP.NET源碼之自定義控件DateTimePicker怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

新聞名稱:ASP.NET源碼之自定義控件DateTimePicker怎么用
文章來(lái)源:http://bm7419.com/article28/gocojp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、網(wǎng)站排名全網(wǎng)營(yíng)銷推廣、外貿(mào)建站定制網(wǎng)站、網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化