我想创建一个包含常见任务类的类库。
我创建了一个在某些表单上运行得非常好的类但它有一些我无法追查的错误。
这是我的代码,它执行以下操作:
代码:
Sub setRecordFieldToControl(ByVal root As Form, ByVal dgv As DataGridView, ByVal cntrlPreNam1 As String, ByVal cntrlPreNam2 As String)
Dim j, k, z As Integer
Dim s As String
z = dgv.ColumnCount
k = dgv.CurrentRow.Index
j = 0
Dim headTxt(z) As String
For indx = 0 To z - 1
headTxt(indx) = dgv.Columns(indx).HeaderText
Next
For Each i As Control In root.Controls
If TypeOf i Is MaskedTextBox Or TypeOf i Is ComboBox Then
For clm = 0 To z
If i.Name = cntrlPreNam1 & headTxt(clm) Or i.Name = cntrlPreNam1 & headTxt(clm) Then
s = (dgv.Rows(k).Cells(j).Value)
i.Text = s
' i.Text = dgv.Item(j, k).Value
j = j + 1
If j >= z Then
Exit For
End If
End If
Next
End If
Next
End Sub
我的问题是:在某些表格上我遇到了这个错误:
指数超出 i.Text = s
行的范围
当我在文本框中放入其他内容时,错误不会显示,只有当我将s放入其中时才会出现错误。
答案 0 :(得分:2)
错误可能在
行For clm = 0 To z
应该阅读
For clm = 0 To z - 1
列索引的范围为0 .. number_of_columns - 1。
<强>更新强>
您的代码存在一些问题:
逻辑对我来说似乎不对。您正在查找具有正确名称的列(clm
),然后获取另一列(j
)的值。为什么呢?
变量名称没有发言,甚至具有误导性(例如i
为Control
)。
您有嵌套循环,其行为为O(n ^ 2)。请参阅Big O Notation。
我建议改写它。使用字典表示可能的控件名称,该名称按名称存储相应的列索引。字典具有几乎恒定的访问速度。换句话说:查找非常快。
Sub SetRecordFieldToControl(ByVal root As Form, ByVal dgv As DataGridView, _
ByVal cntrlPrefix1 As String, ByVal cntrlPrefix2 As String)
Dim currentRowIndex As Integer = dgv.CurrentRow.Index
Dim columnDict = New Dictionary(Of String, Integer)
For i As Integer = 0 To dgv.ColumnCount - 1
Dim headerText As String = dgv.Columns(i).HeaderText
columnDict.Add(cntrlPrefix1 & headerText, i)
columnDict.Add(cntrlPrefix2 & headerText, i)
Next
For Each cntrl As Control In root.Controls
If TypeOf cntrl Is MaskedTextBox Or TypeOf cntrl Is ComboBox Then
Dim columnIndex As Integer
If columnDict.TryGetValue(cntrl.Name, columnIndex) Then
Dim value As Object
value = dgv.Rows(currentRowIndex).Cells(columnIndex).Value
If Not value Is Nothing Then
cntrl.Text = value.ToString()
End If
End If
End If
Next
End Sub