关于.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数据库系统中的编程与应用