如何在VB6中动态设置文本框值
How to dynamically set textbox values in VB6
我想用数据库值动态设置一些文本框值。
我尝试使用类似于下面的东西,但出现以下编译错误:
无法分配给只读 属性。 .name = 突出显示。
是否可以用这种方式分配文本框值?
Dim x As Integer
For x = 1 To 30
Form1.RS.Fields(x).Name = RS.Fields(x).Value
Next
您可以尝试使用以下形式的控件集合:
Dim x As Integer
For x = 1 To 30
Form1.Controls(RS.Fields(x).Name).Text = RS.Fields(x).Value
Next
假设您有一个索引为 1 到 30 的 Text1
个文本框数组,您可以使用:
Dim iCounter As Integer
For iCounter = 1 To 30
' Check that counter is within the bounds of the Text1 array
If iCounter >= Text1.LBound And iCounter <= Text1.UBound Then
Text1(iCounter).Text = RS.Fields(iCounter).Value
End If
Next
这里有额外的代码来检查计数器是否在 Text1 数组的范围内。 Text1 数组在其 LBound 和 UBound 值之间可能存在间隙(缺失项),因此它并不完美。例如,您可以删除 Text1(13),但仍然有 LBound = 1 和 UBound = 30。最简单的方法是检查错误“340”,如果您决定添加它。由于您正在构建 UI,因此您可以简单地删除任何间隙。
使用文本框控件数组可以共享如下公共代码,当光标进入文本框时突出显示文本:
Private Sub Text1_GotFocus(Index As Integer)
With Text1(Index)
.SelStart = 0
.SelLength = Len(.Text)
End With
End Sub
作为对 Eddi 回答的补充,下面是允许在表单上使用多种控件类型的代码:
Dim x As Integer
For x = 1 To 30
If TypeOf Me.Controls(RS.Fields(x).Name) Is TextBox Then
Me.Controls(RS.Fields(x).Name).Text = RS.Fields(x).Value
ElseIf TypeOf Me.Controls(RS.Fields(x).Name) Is CheckBox Then
Me.Controls(RS.Fields(x).Name).Value = _
IIf(RS.Fields(x).Value = 1, vbChecked, vbUnchecked)
End If
Next
上述代码的一个缺点是智能感知的丢失。您可以像下面这样构造代码,使其成为强类型的,这有很多好处,包括智能感知:
Dim tb As TextBox
Dim cb As CheckBox
Dim x As Integer
For x = 1 To 30
If TypeOf Me.Controls(RS.Fields(x).Name) Is TextBox Then
Set tb = Me.Controls(RS.Fields(x).Name)
tb.Text = RS.Fields(x).Value
ElseIf TypeOf Me.Controls(RS.Fields(x).Name) Is CheckBox Then
Set cb = Me.Controls(RS.Fields(x).Name)
cb.Value = IIf(RS.Fields(x).Value = 1, vbChecked, vbUnchecked)
End If
Next
我想用数据库值动态设置一些文本框值。
我尝试使用类似于下面的东西,但出现以下编译错误: 无法分配给只读 属性。 .name = 突出显示。
是否可以用这种方式分配文本框值?
Dim x As Integer
For x = 1 To 30
Form1.RS.Fields(x).Name = RS.Fields(x).Value
Next
您可以尝试使用以下形式的控件集合:
Dim x As Integer
For x = 1 To 30
Form1.Controls(RS.Fields(x).Name).Text = RS.Fields(x).Value
Next
假设您有一个索引为 1 到 30 的 Text1
个文本框数组,您可以使用:
Dim iCounter As Integer
For iCounter = 1 To 30
' Check that counter is within the bounds of the Text1 array
If iCounter >= Text1.LBound And iCounter <= Text1.UBound Then
Text1(iCounter).Text = RS.Fields(iCounter).Value
End If
Next
这里有额外的代码来检查计数器是否在 Text1 数组的范围内。 Text1 数组在其 LBound 和 UBound 值之间可能存在间隙(缺失项),因此它并不完美。例如,您可以删除 Text1(13),但仍然有 LBound = 1 和 UBound = 30。最简单的方法是检查错误“340”,如果您决定添加它。由于您正在构建 UI,因此您可以简单地删除任何间隙。
使用文本框控件数组可以共享如下公共代码,当光标进入文本框时突出显示文本:
Private Sub Text1_GotFocus(Index As Integer)
With Text1(Index)
.SelStart = 0
.SelLength = Len(.Text)
End With
End Sub
作为对 Eddi 回答的补充,下面是允许在表单上使用多种控件类型的代码:
Dim x As Integer
For x = 1 To 30
If TypeOf Me.Controls(RS.Fields(x).Name) Is TextBox Then
Me.Controls(RS.Fields(x).Name).Text = RS.Fields(x).Value
ElseIf TypeOf Me.Controls(RS.Fields(x).Name) Is CheckBox Then
Me.Controls(RS.Fields(x).Name).Value = _
IIf(RS.Fields(x).Value = 1, vbChecked, vbUnchecked)
End If
Next
上述代码的一个缺点是智能感知的丢失。您可以像下面这样构造代码,使其成为强类型的,这有很多好处,包括智能感知:
Dim tb As TextBox
Dim cb As CheckBox
Dim x As Integer
For x = 1 To 30
If TypeOf Me.Controls(RS.Fields(x).Name) Is TextBox Then
Set tb = Me.Controls(RS.Fields(x).Name)
tb.Text = RS.Fields(x).Value
ElseIf TypeOf Me.Controls(RS.Fields(x).Name) Is CheckBox Then
Set cb = Me.Controls(RS.Fields(x).Name)
cb.Value = IIf(RS.Fields(x).Value = 1, vbChecked, vbUnchecked)
End If
Next