在c#/VB.NET中使用控件数组

同类型的BASIC语言:VFB,TWINBASIC 2个IDE都实现了控件数组的功能。

控件数组是位于一个窗体上共享同一名称的一组同种类型控件。普通控件仅使用名称就可以识别,而引用控件数组中的成员则需要同时使用名称和索引。开发人员在 Visual Basic 6.0 以及更早的版本中使用控件数组主要有以下三个理由:
1.        在循环中访问数组中控件的属性。
2.        向窗体动态添加新控件。
3.        允许一个事件例程与多个控件连接 。
控件数组的使用,极大的方便了开发人员。然而,刚刚从Visual Basic6.0(以下简称VB6.0)过渡到Visual Basic.Net(以下简称VB.NET)的初学者却发现,在VB.NET中似乎不能使用控件数组了。笔者仔细查阅了VB.NET的MSDN文档发现,在 VB.NET 中,确实不再支持控件数组。原因是,VB.NET对事件模型作了很大的改动,引入了另外一种数据类型――控件集合模型,使控件数组没有存在的必要。就像 VB6.0 中的控件数组可以共享事件一样,VB.NET 中的事件模型允许任何事件处理程序都可以处理来自多个控件的事件,这就允许创建属于不同类型但共享相同事件的控件组。
所谓控件集合是指包含在一个容器中的所有控件的总和,能够创建控件集合的容器有:Form、Panel、GropBox等。程序运行时,可以通过访问容器的Control属性来得到该容器中的所有控件。
下面将演示如何通过控件集合来使用控件数组:
一、        直接使用Form容器的控件集合来使用控件数组:
建立一个VB.NET项目,在Form1中添加三个TextBox控件,名称分别为:TextBox1、TextBox2、TextBox3,一个Button控件。
双击Button,输入如下代码:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ‘下面的语句是通过数组元素的下标来访问Form中的每一个元素。 Me.Controls.Item(0).Text = "集合中的第一个元素" Me.Controls.Item(1).Text = "集合中的第二个元素" Me.Controls.Item(2).Text = "集合中的第三个元素" Me.Controls.Item(3).Text = "集合中的第四个元素"

End Sub

运行项目后,点击Button,看到的结果是:Form1中的所有控件(包括Button自己)的Text属性都被修改了,同时还发现,最后加入的的控件变成了集合中的第一个元素(下标为0)。这个结果说明:
Form1中的所有控件已经自动构成了一个控件集合(控件数组),这个特点使得建立控件数组变得非常简单。
在访问这些控件时,除了可以通过控件名称直接访问外,还可以通过Contro.Item(n)属性按下标访问集合中的每一个控件;
集合中控件的类型可以不相同,这点和VB6.0完全不同;
集合中的下标顺序是按照加入控件的顺序倒排的;
VB.NET中控件数组的特点让人稍感不适的是,控件数组的下标是按加入顺序的倒排续产生的,但程序员完全可以改变这个顺序:在代码编辑窗中点击“#Region " Windows 窗体设计器生成的代码”旁边的“+”号,代码展开后,找到如下代码:
Me.Controls.Add(Me.Button1)
Me.Controls.Add(Me.TextBox3)
Me.Controls.Add(Me.TextBox2)
Me.Controls.Add(Me.TextBox1)
这个代码顺序就是控件数组的下标顺序,只要改变这个顺序就可以改变控件数组中每个以元素的下标。
在Form中构成控件数组非常方便,但也有一个小问题:一般来说,Form中的控件往往有很多种,系统建立控件集合的时候将会把其中的所有控件放在同一个集合中,这样一来,程序员在写代码的时候有可能将每一个控件的下标混淆,为了解决这个问题,可以用Panel容器来根据需要将某类控件建立成控件数组,也就避免了上述问题。
建立的方法非常简单:只需要在Form中添加一个Panel控件,然后将需要建立控件数组的控件加入其中即可,然后用:Panel.Control.Item(n)来访问其中的每一个控件。
二、        用代码建立控件集合。
    建立一个VB.NET项目,在Form中添加三个TextBox和一个Button控件,在代码编辑窗口中输入如下代码:

Dim TextboxArray As New ArrayList ‘定义一个数组例表
Private Sub BiuldTextBoxArray() ‘过程用来将Form上的三个TextBox加入到数组例表中TextboxArray.Add(TextBox1)TextboxArray.Add(TextBox2)TextboxArray.Add(TextBox3)
End Sub

‘让Form在启动的时候将三个TextBox控件加入到数组例表中,构成控件数组。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.LoadBiuldTextBoxArray()
End Sub

‘编写Button点击事件代码,利用控件数组访问三个TextBox控件

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.ClickTextboxArray(0).text = "文本框第一个元素"TextboxArray(1).text = "文本框第二个元素"TextboxArray(2).text = "文本框第三个元素"
End Sub

运行工程,点击Button,发现三个TextBox都被修改了,效果和前面的方法一样。
三、        在程序中动态添加控件数组。
前面定义的控件数组都是在设计阶段完成的,它要求,控件数组中的控件数量必须已知,也叫静态控件数组;但很多时候要求,控件数组中的控件数量要用程序的某些运行情况来确定,这就要求,控件数组中的控件要能实现动态添加。
建立一个VB.NET工程,在Form上添加两个Button,其中,Button1用来添加动态控件数组;Button2用来修改数组中每个控件的属性。
在代码编辑窗口中输入如下代码:

Dim List As New ArrayList ‘定义一个例表对象,用来集合数组控件
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.ClickDim i As IntegerFor i = 0 To 4 ‘利用循环语句动态加入控件数组。Dim FirstTextBox As New TextBox ‘定义文本框对象Me.Controls.Add(FirstTextBox) ‘将一个文本框控件加入到Form上List.Add(FirstTextBox) ‘将文本框控件加入到例表集合中List.Item(i).top = i * List.Item(i).height + 20 ‘修改新加入控件在Form上的位置List.Item(i).left = 100FirstTextBox.TabIndex = i ‘修改新加入控件的TabIndex值List.Item(i).text = "TextBox" & i.ToString ‘修改默认文本。Next
End Sub

用循环来访问动态控件数组中的控件。

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.ClickDim i As IntegerFor i = 0 To 4List.Item(i).text = "第 " & i.ToString & " 个元素"Next
End Sub

运行项目,先点击Button1,Form上将出现5个文本框,然后再点击Button2,修改这五个文本框的Text属性。
从这个实例看出,VB.NET中动态加入控件数组与在VB6.0中实现动态数组有一个显著的不同:VB6.0中必须要有一个静态的“控件种子”,而在VB.NET中已经不需要了。
四、        控件数组的事件响应。
控件数组的最重要的特色之一就是让一组控件响应同一个事件,在事件例程中接收控件具体某控件的Index值来分别处理处理具体问题,这点已经在VB6.0中表现得淋漓尽致了,它在VB.NET中同样可以实现,只不过实现方式有了变化。由于在容器中的每一个控件只要不作特殊处理,都会自动构成了控件集合,这样,只要对原有的事件例程作少量修改,就可以非常方便的实现用一个事件例程响应某个集合中所有控件产生的事件。
下面演示实现用同一个例程来处理两个Button和一个TextBox发出的Click事件。
建立一个VB.NET项目,在Form上添加两个Button,和一个TextBox。
在代码编辑窗口中点击“#Region " Windows 窗体设计器生成的代码”旁边的“+”号,代码展开后,找到如下代码并调整为下面的顺序:
Me.Controls.Add(Me.TextBox1)
Me.Controls.Add(Me.Button1)
Me.Controls.Add(Me.Button2)
输入如下代码:

Private Sub mControl_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, TextBox1.ClickSelect Case sender.tabindexCase 0MessageBox.Show("你点击了 Button1 按钮")Case 1MessageBox.Show("你点击了 Button2 按钮")Case 2MessageBox.Show("你点击了 TextBox1 按钮")End Select
End Sub

在这段 代码中:Private Sub mControl_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, TextBox1.Click 是一个自定义事件,在Handles后面的语句表示:该例程将响应Button1, Button2, TextBox1控件发出的Click事件,如果还有其他控件,也可以放在后面,每一个控件名称用“,”号隔开。
运行项目,分别点击Form上面的三个控件就能体会到它的用法。

====================

vb.net里面的动态控件数组的问题,这个动态控件数组在vb里面easy到极致,可是在vb.net里面却有点让人摸不着头脑。
其实也很简单,因为vb.net和vb不同拉,来看看vb.net的动态控件数组如何实现。

1、在form的头部定义一个公共的ArrayList类型的变量    

      Dim m_items As New ArrayList

2、在程序中动态生成控件

       while (a<b)

           dim lblControl as Label= new Label

           lblControl .Text="你好"
           lblControl .dock=......top
           lblControl .autosize=false.
           ....

           me.controls.add(lblControl )'把动态产生的控件放到对应的区域


           '下面这个地方注意拉,
           m_items.Add(lblControl )'把这个label放到前面第一步定义的ArrayList中去
           AddHandler label.Click, AddressOf LblControlArrayClick '给这组动态控件定义click事件的触发函数LblControlArrayClick 。

       end while

3、定义LblControlArrayClick 的click事件的触发函数,这个是和vb不同的地方的关键所在拉。

'控件数组事件

Private Sub LblControlArrayClick (ByVal sender As Object, ByVal e As EventArgs)Dim lblText As StringlblText = CType(sender, Label).Text                    '这里CType就是将触发事件的对象还原为Label对象,'有点像java里面的集合阿,放进去后再取出来的时候,要造型一下。msgbox ("所电击的动态控件的文字是:" & lblText)end sub

好啦,就是这么简单,vb.net中的控件数组。

如果你要为控件数组定义其他的触发事件,只要修改对应的触发就可以了。

分类: VB.Net

好文要顶 关注我 收藏该文 

夏、初心
粉丝 - 0 关注 - 0

+加关注

0

0

升级成为会员

« 上一篇: VB.NET中的类和模块
» 下一篇: PickBoxTest示例(1)

posted @ 2021-05-18 08:42  夏、初心  阅读(2242)  评论(0)  编辑  收藏  举报

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/329722.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java集合篇】HashMap 是如何扩容的

HashMap 是如何扩容的 ✔️ 为什么需要扩容?✔️ 桶元素重新映射✔️链表重新链接✔️ 取消树化✔️拓展知识仓✔️除了rehash之外&#xff0c;哪些操作也会将树会退化成链表? ✔️ 为什么需要扩容? HashMap在Java等编程语言中被广泛使用&#xff0c;用于存储键值对数据。Ha…

WebofScience快速检索文献的办法

Web of Science为什么老是搜不到文章&#xff0c;原来是要在这个地方全部勾选 如果是搜标题的话&#xff0c;选Title&#xff0c;输入你要搜的文章标题 另外&#xff0c;也可以在浏览器直接搜文章标题&#xff0c;得到文章的DOI&#xff0c;然后选DOI&#xff0c;直接搜DOI也行…

CLIP is Also an Efficient Segmenter

表1 复现结果–Seed&#xff1a;70.7245673447014&#xff0c;dCRF&#xff1a;74.85437742935268 误差小于0.5个点&#xff0c;可以接受 表4 复现结果–训练300轮&#xff0c;Val&#xff1a;58.76741354153312&#xff0c;Test&#xff1a;59.18210 感想 VOC全部复现完成&…

【EAI 004】LLM+P:借助LLM和PDDL赋予机器人最优规划能力

论文标题&#xff1a;LLMP: Empowering Large Language Models with Optimal Planning Proficiency 论文作者&#xff1a;Bo Liu, Yuqian Jiang, Xiaohan Zhang, Qiang Liu, Shiqi Zhang, Joydeep Biswas, Peter Stone 作者单位&#xff1a;Department of Computer Science, Th…

关于使用统一服务器,vscode和网页版jupyter notebook的交互问题

autodl 查看虚拟环境 在antodl上租借了一个服务器&#xff0c;通过在网页上运行jupyter notebook和在vscode中运行&#xff0c;发现环境都默认的是miniconda3。 conda info --envs 当然环境中所有的包都是一样的。 要查看当前虚拟环境中安装的所有包&#xff0c;可以使用以…

用通俗易懂的方式讲解:使用 Mistral-7B 和 Langchain 搭建基于PDF文件的聊天机器人

在本文中&#xff0c;使用LangChain、HuggingFaceEmbeddings和HuggingFace的Mistral-7B LLM创建一个简单的Python程序&#xff0c;可以从任何pdf文件中回答问题。 一、LangChain简介 LangChain是一个在语言模型之上开发上下文感知应用程序的框架。LangChain使用带prompt和few…

揭秘六大热门认证考试

六大热门认证考试是什么❓今天为大家详细解读PMP、ACP、CDGA、软考中项、软考高项、NPDP、CISP等热门认证考试&#xff0c;让你不再彷徨&#x1f447; 1️⃣PMP &#x1f451;PMP认证是全qiu公ren的项目管理专业认证&#xff0c;旨在评估项目管理人员在项目过程中所需的知识、技…

Java学习苦旅(二十二)——MapSet

本篇博客将详细讲解Map和Set。 文章目录 搜索概念模型 MapMap.Entry<K, V>Map的常用方法说明TreeMap和HashMap的区别 Set常用方法说明TreeSet和HashSet的区别 结尾 搜索 概念 Map和set是一种专门用来进行搜索的容器或者数据结构&#xff0c;其搜索的效率与其具体的实例…

C++流媒体服务器 ZLMediaKit框架ZLToolKit源码解读

ZLMediaKit是国人开发的开源C流媒体服务器&#xff0c;同SRS一样是主流的流媒体服务器。 ZLToolKit是基于C11的高性能服务器框架&#xff0c;和ZLMediaKit是同一个作者&#xff0c;ZLMediaKit正是使用该框架开发的。 ZLMediaKit开源地址&#xff1a;https://github.com/ZLMedi…

RT-DETR Gradio 前端展示页面

效果展示 使用方法 Gradio 是一个开源库,旨在为机器学习模型提供快速且易于使用的网页界面。它允许开发者和研究人员轻松地为他们的模型创建交互式的演示,使得无论技术背景如何的人都可以方便地试用和理解这些模型。使用Gradio,你只需几行代码就可以生成一个网页应用程序,…

route 命令

格式&#xff1a; route [-f] [-p] [Command] [Destination] [mask Netmask] [Gateway] [metric Metric] [if Interface] 功能&#xff1a; route 命令是用于操作基于内核ip路由表&#xff0c;它的主要作用是创建一个静态路由让指定一个主机或者一个网络通过一个网络接口。 …

CSS效果(工作中常用)

1、css文字溢出省略号 overflow: hidden; // 溢出隐藏 text-overflow: ellipsis; // 溢出用省略号显示 white-space: nowrap; // 规定段落中的文本不进行换行 overflow: hidden; // 溢出隐藏 text-overflow: ellipsis; // 溢出用省略…