?

關于.net控件數組的探討

2018-08-13 09:44胡建飛
軟件 2018年7期
關鍵詞:數組控件應用程序

胡建飛

?

關于.net控件數組的探討

胡建飛1,2

(1. 中海油能源發展股份有限公司管道工程分公司,天津 300452;2. 海油發展珠海管道工程有限公司,廣東 珠海 519000)

本文介紹了在VB.NET和ASP.NET中實現控件數組的方法,并介紹了一些控件數組的技巧。本文進一步探討了.NET中不使用控件數組實現控件數組功能的方法,從中我們可以知道,.NET不使用控件數組的原因,進一步了解在.NET中實現控件數組類似功能的方法,加深我們對.NET控件集合概念的理解。

.NET;控件數組

0 引言

從VB6時代走過來的程序員都習慣使用一種叫控件數組的編程方式,使用控件數組有以下作用:

1、可以循環遍歷數組中所有控件。

2、還可以動態向程序添加新的控件。

3、最主要的是可以讓多個控件響應同一段代碼。

但是到了.NET中我們發現習慣使用的控件數組被取消了,這讓從VB6過渡到.NET的程序員非常不適應,實際上.NET引入了控件集合模式,比控件數組更加靈活,使控件數組變得沒有必要。

而且.NET并非完全取消了控件數組,通過一些技巧我們照樣可以建立控件數組,繼續使用習慣的編程方式,下面我們通過VB.NET和ASP.NET分別介紹在windows應用程序編程和網頁編程中控件數組的實現。

1 VB.NET應用程序中建立控件數組的方法[1,2,3]

我們先討論在windows應用程序中使用控件數組的方法,以VB.net為例,我們要在窗口中動態建立100個TextBox控件,代碼(VB語言)如下:

Dim txt(323) As TextBox

For i = 0 To 99

txt(i) = New TextBox

txt(i).Size = New Size(60, 21)

txt(i).Tag = i.ToString

Me.Controls.Add(txt(i))

AddHandler txt(i).GotFocus, Ad-d-ressOf txt_gotfocus

AddHandler txt(i).LostFocus, Ad-dressOf txt_lostfocus

AddHandler txt(i).TextChanged, Ad-dressOf txt_changed

AddHandler txt(i).KeyPress,

AddressOf txt_keypress

Next

在上面的代碼中,我們建立了下標從0到99的共100個TextBox,并把這100個TextBox使用Me.Controls.Add(txt(i))語句加入到窗口中,分別為每個TextBox 的GotFocus、LostFocus、TextChanged、KeyPress指定了執行的代碼。

2 VB.NET控件數組位置指定[4,5]

這100個控件加入窗口后,并非按照我們想要的位置加入的,我們可以使用循環為每個TextBox指定位置,在應用程序設計中,我們可以方便的使用location屬性設置控件的位置,例如我們要將這些控件每行20個,排列5行,代碼如下:

Dim y = 200

Dim x = 10

For i = 0 To 99

txt(i).Location = New Point((i Mod 20) * 60 + x, y + (i 20) * 21

Next

其中x,y是第一個控件的坐標,我們可以通過設置x,y的值來調整這100個控件左上角位置。

然后使用循環遍歷這100個控件,每行20個,而控件的大小長是60,高是21,通過New Point((i Mod 20) * 60 + x, y + (i 20) * 21 算式得出每個控件的位置,然后賦值給控件的location屬性。

3 VB.NET控件數組下標的取得[6,9]

.NET中我們雖然可以建立控件數組,控件執行代碼時我們可以通過sender得到執行代碼的控件,但是通過sender我們無法像VB6中很方便得到下標,這里我們使用了一個小技巧,在前面我們建立控件數組時設置了一個tag屬性,這個tag屬性其實就是控件的一個備注,循環創建控件時,我們將循環數字i轉換成字符串保存在tag屬性中,待我們想使用下標時可以從tag屬性中取出,代碼如下:

i = CType(sender.tag, Integer)

4 ASP.NET控件數組的建立

相比windows應用程序,在ASP.NET中建立控件數組要復雜的多,下面以C#語言為例,在頁面中建立100個TextBox控件,代碼(C#語言)如下:

TextBox[] TXT = new TextBox[100];

for (int i =0; i <= 99; i++)

{

TXT[i] = new TextBox();

Panel1 .Controls.Add(TXT[i]);

TXT[i].ID = "T_" + i.ToString() ;

TXT[i].TextChanged += new EventHandler (TextBox1_TextChanged);

}

通過以上代碼,我們動態建立了100個TextBox控件,但是我們無法像windows應用程序中那樣通過設置控件的坐標來設置這100個控件的位置,這里我們在頁面中放入一個panel控件,然后將控件全部加入到panel控件,通過設置panel控件的位置來調整新加入控件的位置。

5 ASP.NET中動態建立控件數組特別注意事項

我們一般理解ASP.NET中建立控件只需要加載一次即可,所以以上創建控件數組的代碼應該也是運行一次即可,如果這樣做運行時就會出現了錯誤,因為ASP.NET中我們用戶自己動態加載的控件每次頁面刷新時都要重新加載一次,這與我們大多人想象的不同。所以上面創建控件數組的代碼每次刷新頁面都要加載一次。

控件每次更新頁面都重新加載,那里面輸入的數據怎么辦呢?這個不用我們管,服務器會通過ViewState對象把控件中的數據傳遞到更新后頁面的同名控件中。

6 ASP.NET控件數組下標的取得技巧[4,8,10]

在ASP.NET中控件沒有tag屬性,所以我們不能像windows應用程序中那樣使用這個屬性來保存下標了。

第一個方法是使用循環對所有控件做一個遍歷,將所有控件依次和sender進行對比,找到相等的控件,從而得到下標,但這種方法比較耗費資源。

比較取巧的方法是建立控件數組時我們將每個控件的ID設置成T_0、T_1、T_2。。。的形式,之所以前面加了“T_”,是因為控件ID不能設置成純數字。

在執行代碼時可以通過下面的語句得到控件的下標:

int i = Convert.ToInt16(((TextBox)sender). ID.Replace("T_", ""));

7 綜合實戰演練---多維數組的建立與運用[6,7]

如圖1所示,我們要在頁面中建立100個TextBox控件,每行20個,共5行。因為圖中所示的排列原因,我們使用二維數組來建立會使代碼更加直觀,首先我們在頁面中拖入一個panel控件,命名為Panel1,創建控件的代碼如下:

protected void Page_Load(object sender, EventArgs e)

{

Panel[] pp = new Panel[5];

TextBox[,] TXT = new TextBox[20, 5];

for (int i = 0; i <= 4; i++)

{

pp[i] = new Panel();

Panel1.Controls.Add(pp[i]);

for (int j = 0; j < 20; j++)

{

TXT[j, i] = new TextBox();

pp[i].Controls.Add(TXT[j, i]);

TXT[j, i].BorderWidth = 1;

TXT[j, i].Width = 50;

TXT[j, i].Height = 18;

TXT[j, i].AutoPostBack = true;

TXT[j, i].TextChanged += new EventHandler(TextBox1_TextChanged);

TXT[j, i].Text = "";

TXT[j, i].ID = "T_" + j.ToString() + "_" + i.ToString();

}

}

}

圖1 多維數組應用

在以上代碼中,在建立TextBox控件數組TXT的同時,我們還建立了一個panel控件數組pp,作用是將100個TextBox分成5組,每組20個。

根據循環TXT控件分別命名為T_0_0、T_1_0、T_2_0。。。T_19_4的形式,用以儲存控件的兩個下標。在每個控件創建時設置了外觀屬性,并設置了TextChanged事件響應的代碼。

執行代碼時如果要取得控件下標,可以使用如下代碼:

string[] fstring = ((TextBox )sender).ID.Split(new char[] { '_' });

int x = Convert.ToInt16(fstring[1]. ToString());

int y = Convert.ToInt16(fstring[2]. ToString());

因為控件ID是T_0_2的形式,使用“_”將控件ID分裂為字符串數組,則數組的第二項和第三項分別就是控件的兩個下標。

8 不使用數組在.NET中實現控件數組功能

從老版本編程環境走過來的程序員通過一些技巧實現了控件數組,可以使用熟悉的方式來寫代碼,但.NET為何要取消控件數組呢?我們開始提到使用控件數組主要有3個原因:

第一,可以對數組中所有控件進行遍歷。但.NET引入了控件集合的概念,我們可以使用foreach語句對頁面或某個容器中的控件進行遍歷。

第二,可以動態添加新控件。在.NET中我們可以動態向頁面或容器中添加新的控件,與控件是不是某個數組的元素無關。

第三,多個控件執行同一代碼。這點在VB6時代只能通過控件數組來實現,也是控件數組存在的主要原因,然而.NET中每個控件的每個事件響應的代碼都可以單獨指定,多個控件執行同一代碼在.NET中根本無需控件數組。

控件數組還有個用處便是下標,但是我們在上面的例子中,完全可以使用控件名稱來得到和下標同樣的作用。

控件數組可以通過下標指定某一個控件,在.NET中可以使用this.FindControl語句通過控件名稱來指定某個控件。

從上我們可以得出結論,在.NET中不使用控件數組依然可以實現所有控件數組的功能,這也是.NET在明面上取消了控件數組的原因,只要我們耐心學習,慢慢習慣就能適應。

9 結語

.NET并非完全取消了控件數組,通過一些技巧我們依然可以實現控件數組,但是.NET已經可以不使用數組概念實現全部控件數組的功能。

通過對控件數組的探討,我們可以加深對.NET控件集合概念的理解。隨著編程技術的進步,程序員也要與時俱進,不斷更新自己才能跟上時代。

[1] 龐婭娟, 房大偉, 呂雙. ASP.NET從入門到精通, 清華大學出版社.

[2] JavaScript從入門到精通, 清華大學出版社.

[3] 蔣順業. ASP.NET應用程序開發軟件設計與應用研究[J]. 軟件, 2017, 37(10): 95-97.

[4] 蘭洋, 蔣順業. 基于asp.net 的FMS 生產管理系統[J]. 軟件, 2013, 34(5): 76-78.

[5] 余翠蘭. 基于ASP.NET 的學生住宿管理系統的設計與實現[J]. 軟件, 2014, 35(4): 37-41.

[6] 賈志先. 袁芳. 基于ASP.NET 數據分頁導航的設計與應用[J]. 軟件, 2015, 36(12): 60-62.

[7] 周瑞. 從零開始學JavaScript, 電子工業出版社.

[8] VB.NET 2005程序設計從入門到精通, 人民郵電出版社.

[9] Java從入門到精通, 清華大學出版社.

[10] 袁芳. 教學做一體化ASP.NET 課程教學改革與實踐[J]. 軟件, 2014, 35(11): 126-128.

A Discussion on the Array of .NET Controls

HU Jian-fei1,2

(1. CNOOC Energy Technology and Services-Pipe Engineering Co., Ltd, Tianjin 300452; 2. CNOOC Energy Technology & Services Zhuhai Pipe Engineering Co., Ltd, Zhuhai 519000)

This paper introduces the method of realizing control array in VB.NET and ASP.NET, and introduces some skills of control array. In this paper, we further discuss the method of realizing the function of the array of controls in .NET without using a control array. From this, we can know the reason that .NET does not use the array of controls, and further understands the method of realizing the similar function of the control array in .NET, and deepens our understanding of the idea of the collection of .NET controls.

.NET; Array of controls

TP311.52

B

10.3969/j.issn.1003-6970.2018.07.021

胡建飛(1979-),男,本科,工程師,管道涂敷數據,ASP.NET編程。

本文著錄格式:胡建飛. 關于.net控件數組的探討[J]. 軟件,2018,39(7):103-105

猜你喜歡
數組控件應用程序
JAVA稀疏矩陣算法
JAVA玩轉數學之二維數組排序
刪除Win10中自帶的應用程序
Excel數組公式在林業多條件求和中的應用
尋找勾股數組的歷程
ASP.NET服務器端驗證控件的使用
三星電子將開設應用程序下載商店
微軟軟件商店開始接受應用程序
Spreadsheet控件在Delphi數據庫系統中的編程與應用
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合