如何通过制作classLibrary点击gridview后填写所有文本框?

时间:2013-12-12 23:16:18

标签: asp.net vb.net

我想创建一个包含常见任务类的类库。

我创建了一个在某些表单上运行得非常好的类但它有一些我无法追查的错误。

这是我的代码,它执行以下操作:

  • 它接受3个参数:表单名称,datagridview名称和文本框名称前缀。
  • 计算datagrid列
  • 它采用当前行索引
  • 使数组的长度与列数相对应
  • 它正在查看所有文本框的表单,这些文本框的名称带有前缀参数+列名并在其中设置值

代码:

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放入其中时才会出现错误。

1 个答案:

答案 0 :(得分:2)

错误可能在

For clm = 0 To z

应该阅读

For clm = 0 To z - 1

列索引的范围为0 .. number_of_columns - 1。


<强>更新

您的代码存在一些问题:

  • 逻辑对我来说似乎不对。您正在查找具有正确名称的列(clm),然后获取另一列(j)的值。为什么呢?

  • 变量名称没有发言,甚至具有误导性(例如iControl)。

  • 您有嵌套循环,其行为为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