使用vb中动态创建的复选框和文本框中的触发事件



我不是vb新手,但我也不是专家。坦率地说,我想自从90年代末的VB6之后,我就再也没有搞过VB了。现在,我有一个项目让我不知所措。

自8月中旬以来,我一直在仔细阅读stackoverflow,以寻找一种解决方案,在该解决方案中,表单具有许多动态创建的控件。在我的项目中,我有一个表格,里面有130个文本框和130个复选框,还有一些零碎的东西。每个文本框旁边都有一个关联的复选框。复选框中的单击事件需要更改文本框的外观,并且根据文本框的内容启用/禁用复选框。

在我的第一次尝试中,我有100%的工作,所有事件都由更改时的文本框和单击事件时的复选框单独处理。代码很笨重,很难更新,因为对一件事的任何更改都必须重复。。。好了129次。更不用说所有的控件都是手动放置在表单上的,然后像我提到的那样定位。

在我的第二次尝试中(如下所示(,我尝试使用动态创建的控件。我的主要兴趣是文本框和复选框控件,尽管还有其他控件。到目前为止,我已经生成了表单,一切看起来都很棒。。。现在是为了让它发挥作用;即向适用的代码发送更改和点击事件。

我有一些代码(下面(可以捕获事件-排序为一个集合。但问题是,我的代码捕获了所有事件,而没有精确定位是什么索引控件触发了事件。我不知道如何捕捉特定控件的事件;即checkbox(78(。Checked…将Checked事件传递给代码,然后该代码可用于更新TextBox(78(。

这是我迄今为止所拥有的。。。

Public Class Form1
Dim dynTextBox(129) As TextBox
Dim BoxesList As New List(Of TextBox)
Dim dynCheckBox(129) As CheckBox
Dim CheckBoxList As New List(Of CheckBox) 
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim X, Y, YY As Integer
YY = 0 'Adds the same amount of pixels to all calculations
X = 20 : Y = 40 'Boxes starting position
'Set up textboxes
For j = 0 To 6
For i = 0 To 19
dynTextBox(i) = New TextBox
With dynTextBox(i)
.Parent = Me
.Size = New Size(100, 50)
.Location = New Point(X, Y)
' I removed formatted stuff since it does not apply
' to my question
Me.Controls.Add(dynTextBox(i))
BoxesList.Add(dynTextBox(i))
'AddHandler dynTextBox(i).Click, AddressOf Clickbox
End With
Y += 35
If (j * 20) + i = 129 Then i = 19
Next
Y = 40 + YY ' YY is used to move everything down if needed.
X += 150
Next
'CheckBoxes starting position
X = 122 : Y = 42 + YY
'Setup 130 CheckBoxes
For j = 0 To 6
For i = 0 To 19
dynCheckBox(i) = New CheckBox
With dynCheckBox(i)
.Parent = Me
.Size = New Size(20, 20)
.Location = New Point(X, Y)
.Text = i.ToString
.Enabled = True ' This will be set to false later.
' Changing a related text box needs
' to enable the associated checkbox.
Me.Controls.Add(dynCheckBox(i))
'CheckBoxList.Add(dynCheckBox(i))
AddHandler dynCheckBox(i).CheckedChanged, AddressOf OnCheckBoxClick
End With
Y += 35
If (j * 20) + i = 129 Then i = 19
Next
Y = 42 + YY ' YY is used to move everything down if needed.
X += 150
Next
End Sub
Sub OnCheckBoxClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim i As Integer
For i = 0 To 19
If dynCheckBox(i).Text = sender.text Then
MessageBox.Show(dynCheckBox(i).Text & " Item: " & (i + 1).ToString)
End If
Next
End Sub
End Class

正如您所看到的,我停止了捕捉CheckBox点击事件的尝试。由于这并没有像我希望的那样起作用,所以我没有试图在捕捉TextBox更改事件时失败。";OnCheckBoxClick";子程序从for循环中喷出一个索引号(看起来没用(和位置(在1和20之间(,但不是从dynCheckbox(i(中喷出实际控件的索引。

谦虚点,pcitizen。

以下是答案。。。

问题是我在循环中索引项目。每个循环项目从0开始,一直到19。通过添加一个新的cnt整数,可以在创建每个按钮后将其向上计数1,并用作dynTextBox(cnt(的索引。

最新更新