ASP.NET动态增加控件 继承篇
随着後面要讲得东西越来越深,這邊文章內容以及程式碼,也變得越來越多,因為這不是我原來的目的,
所以我還是會盡量用淺顯易懂的方式來讓大家瞭解。
继承的好处,这里不多说,主要是 示范,如何在 ASP.NET 来继承。
一般常見的繼承是用來改寫ASP.NET 既有的控件,而我最常用不是這方面,而是用來規範網頁標準開發流程,另一方面是用來減少我的程式碼,上述兩方面最終目的,
其實都是為了未來減少系統維護的困難度。
規範標準流程,在多人共同開發上,尤顯其重要性,否則有維護過他人程式的人,都知道每各開發者,都有其風格,你光要瞭解每個人的風格就要花很多時間了,最麻煩的還是,每個人 開發風格,還會隨著他的成長 來變化,這等於你每接收一隻程式,不管是不是同一人,都要重新 瞭解一次開發風格,其中所需成本可想而知。
在這邊程式中有使用 deal_Button_Click 這個函式,這就是一種開發流程的規範,因為我們基底程式已經寫好必要流程,後面要繼承的人,就只能照我們的基底流程來開發,如此一來,如此我們就可以 藉由這種方式,來強迫後面使用的人,一定要用這個方式來開發。
而減少程式碼這個道理 也是顯而易見的,這個開發模式,就我本身長久經驗來看,在使用時,並不用想的太困難,尤其是想要一開始 就要想的很清楚,這都是很困難,反而造成使用這種開發模式的阻礙,我個人建議讀者在使用時,最簡單的方式,其實就是一直不斷的整裡手中的程式碼,把共通的部份集合起來,先能達成減少程式碼的目的就可以了,能減少程式碼,就能吸引其他開發人員一起使用,大家在一起不斷去討論、精進就可以了。
上述的方式,當然只是用一個簡要的方式,讓讀者容易瞭解,在一般大案子中,還是需要資深人員,先規劃架構以及定義相關計畫,來進行開發的,這些都有很多很深奧的理論,在討論了,也不需要我在這來畫蛇添足。
JS_Demo2Base.aspx.cs
1 using System;
2 using System.Data;
3 using System.Collections;
4 using System.Web.UI;
5 using System.Web.UI.WebControls;
6 using System.Web.UI.HtmlControls;
7 using System.Text;
8
9 public class JSDemoBase : System.Web.UI.Page{
10
11 protected HtmlGenericControl sourceTag;
12 protected Button _myBtn;
13 protected TextBox _myTB;
14
15 protected override void OnInit(EventArgs e)
16 {
17 base.OnInit(e);
18
19 Label message = new Label();
20 message.ID = "请输入你要说的话";
21 sourceTag.Controls.Add(message);
22
23 _myTB = new TextBox();
24 _myTB.ID = "input";
25 //input.Text = val;
26 sourceTag.Controls.Add(_myTB);
27
28 _myBtn = new Button();
29 _myBtn.ID = "btnSayHello";
30 _myBtn.Text = "SayHello";
31 sourceTag.Controls.Add(_myBtn);
32
33 string val = Request.QueryString.Get("val");
34 deal_Button_Click(val);
35 }
36
37 public virtual void deal_Button_Click(string value)
38 {
39 }
40
41 public Button btnSayHello
42 {
43 get
44 {
45 return _myBtn;
46 }
47 }
48 public TextBox input
49 {
50 get
51 {
52 return _myTB;
53 }
54 }
55 }
在写基底程式时,如有引用asp.net 上的 server 端控件,请记得要在程式一开始就要先定义(ID、Type 都要一致),如上述程式中的 sourceTag。这样一来就可以程式中来直接使用该控件,就像我们原来 asp.net 程式一般。
JS_Demo2.aspx
1 <%@ Page Language="C#" src="./JS_Demo2Base.aspx.cs" Inherits="JSDemoBase" %>
2
3 <script language="C#" runat="server">
4
5
6 public override void deal_Button_Click(string value)
7 {
8 input.Text = value;
9 if (value != "" && value != null)
10 btnSayHello.Attributes.Add("OnClick", "return SetValue(" + input.ClientID + ");");
11 else
12 btnSayHello.Attributes.Add("OnClick", "return GetOtherValue(" + input.ClientID + ");");
13 }
14
15 </script>
16 <html>
17 <head>
18 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
19 </head>
20 <body>
21 <script type = "text/javascript">
22 var myInput;
23 function GetOtherValue(ctrl) {
24 myInput = ctrl;
25 var hWnd = window.open("JS_Demo.aspx?val=" + ctrl.value, "_blank" );
26 if ((document.window != null) && (!hWnd.opener))
27 hWnd.opener = document.window;
28 return false;
29 }
30 function SetValue(ctrl) {
31 window.opener.myInput.value = "Re: " + ctrl.value;
32 return false;
33 }
34 </script>
35 <form runat="server">
36
37 <h3>动态增加控件 继承篇</h3>
38
39 <p/>
40 <div id="sourceTag" runat="server">
41 </div>
42 <p/>
43 一条小龙
44 </form>
45 </body>
46 </html>