在VB.NET中创建动态控件数组

时间:2017-06-21 09:11:40

标签: arrays vb.net vb6

关于我在这里发现的关于在.NET中伪复制VB6控制数组的帖子...这里是该帖子的链接。

How to create Control Arrays in VB .NET

我需要(或者至少我认为我需要)使用标签的控制阵列。我开始使用面板处理表单,每个表单包含49个标签。在我完成第一个面板之后,我复制并粘贴它以制作另一个面板然后另一个面板等等。在第一个面板上,我为每个标签命名了一个简单的唯一名称Num1用于label1 Num2用于第二个标签,依此类推到Num49。我需要每个面板标签都具有所有相同的名称,这些名称当然无法正常工作。我制作的所有副本都使用默认的Label名称枚举标签。所以我需要一个标签控件数组,以便能够根据每个标签中的文本值更改每个面板的标签前色和后色属性。 示例:我将在数据库中搜索记录,其中column1包含值" 1"然后我想更改每个面板中的每个标签Num1并重置前后颜色以从其他数字标签中突出显示它们。(1到49)没有这里的踢球者......我需要数组来充满活力。在Dbase的sql搜索完成之前,我不知道需要多少个面板。获得" 1"的所有匹配的记录数量后在column1中,我需要对标签数组进行Dim或ReDim以容纳返回的记录数。 例如,据说有20条记录与" 1"在第1列中,我将显示20个面板,其数字为#34; 1"每个面板中的标签从其他数字标签突出显示。每个标签文本值只是1-49的数字。这只是一个简单的例子,因为我可能在搜索中使用了多个列,并突出显示的不仅仅是一个数字标签。 所以我认为这可能是不可能的。我在上面通过Hans Passant链接的原始帖子给出的答案是引起我注意的简单易用的问题,但我需要它是动态的,这取决于返回的记录数量将决定多少个面板将会需要,因此控制阵列的大小。我不认为我将需要任何事件处理,这样可能会更容易,但我可能决定让用户能够点击一个数字标签,这将改变要显示的数据。即。使用精确搜索或第一次搜索的子集突出显示新标签。

任何想法......都可以吗?

这里的Hans代码片段回答了创建文本框的控件数组,没有事件处理。我很喜欢这个,因为它简单易行。

Public Class Form1     Private OrderNumbers()As TextBox

Public Sub New()
    InitializeComponent()
    OrderNumbers = New TextBox() {TextBox1, TextBox2}
End Sub

结束班

现在可以根据我的搜索中返回的记录数量来创建x个文本框。大括号中的项目必须是某种变量,具体取决于所需的数组元素的数量?

1 个答案:

答案 0 :(得分:0)

Journey,我一直在慢慢地从VB6转向VB.NET,并且在构建用于循环的数组时遇到了类似的问题。如果面板的外观相同,您可以尝试使用具有相应名称的49个标签构建一个面板,以便您可以看到它的外观,然后当您获得搜索结果时,动态添加(或删除现有的使用第一个面板作为间距模板,使用标签进行第二次搜索。然后使用面板名称和标签名称子字符串来帮助识别控件。或者,如果您知道所需面板的上限,则可以构建它们并使用面板Visible属性根据需要显示或隐藏它们。

对“适当的名称”的建议,使用“索引号”作为名称的一部分,使用0来填充以获得每个名称的相同长度: 小组:pnl001,pnl002 ......

标签:前4个字符“lblN”,接下来3 =面板编号,最后2 =标签编号,记得不要命名以“lblN”开头的其他非面板标签

pnl001中的

:lblN00101,lblN00102,...,lblN00149

pnl002中的

:lblN00201,lblN00202,...,lblN00249

使用Substring获取“索引”。标签的面板编号是   Val(vCtrl.Name.Substring(3,3))

如果您决定处理更复杂的结果,如果将面板存储在数组vPnl()中,您可以创建一个子程序,通过For / Next循环遍历面板,然后循环通过面板的控件并匹配标签名称或其“索引”最后2个字符与搜索结果。

如果您决定使标签“可点击”,如果您要动态添加控件,同时可以添加事件处理程序。如果面板是在设计模式下构建的,那么可以使用Form_Load中的循环添加处理程序,这样如果添加更多面板,则不必记住添加处理程序。

AddHandler vCtrl(vF).DoubleClick,AddressOf lblN_DoubleClick

以下是动态添加控件的链接 How to programmatically add controls to a form in VB.NET

循环显示面板中的标签:

    Dim vPnl() As Panel ' get the count on records result, then load array

    'pass the search result count and value to test for to a subroutine
    Private Sub proResult(ByVal pResultCt as Integer,ByVal pTest as Integer)
     pResultCt=pResultCt+1
 ' arrays are zero based, add 1 so your loops can be For x=1 to pResultCt
     ReDim vPnl(pResultCt)

     'store the first panel using 1 as index
     vPnl(1)=pnl001
     'dynamically create the number of panels needed
     'store each Panel in vPnl() as you add them
     . . .
     ' or show them and hide the rest if the panels are already built
     '  if doing this way then store the Panels in vPnl() array in Form_Load
     '  and do not use the ReDim above, loop thru the form controls, count
     '  the panels, redim vPnl() using the count+1 so it does not have to be 0 based,
     ' loop thru the form controls again looking
     '  for panel names and use vPnl(VAL(vCtl.Name.Substring(3,3)))=vCtl

     'loop through the panels
     For vF=1 to pResultCt 
      'loop through the controls in the panel, looking for labels
      ' start names with distinct pattern like "lblN"
      ' for the 1-49 label names, like "lblN00101","lblN00102"
      For Each vCtrl As Control In vPnl(vF).Controls
       If vCtrl.Name Like "lblN*" Then
        'get the label "index", VB6 would be VAL(RIGHT(vCtrl.Name,2))
        ' be careful with Substring, the startIndex parameter is 0 based LEFT(vCtrl.Name,2)
        '  would be vCtrl.Name.Substring(0,2)

        vK = Val(vCtrl.Name.Substring(Len(vCtrl.Name) - 2, 2))

        ' now you have the "index" of this label, panel vF, label vK
        ' you could do an If/Then based on it
        If vK=pTest then
         vCtrl.BackColor=Color.Yellow
        Else
         vCtrl.BackColor=Color.White
        End If
        ' or store it in an array variable for future use
      Next
     Next
    End Sub