Asp.net 如何在点击gridview后通过创建classLibrary来填充所有文本框?

Asp.net 如何在点击gridview后通过创建classLibrary来填充所有文本框?,asp.net,vb.net,Asp.net,Vb.net,我想创建一个类库,其中包含用于常见任务的类 我创建了这样一个类,它在某些表单上运行得非常好,但是它有一些我无法追踪的错误 这是我的代码,它执行以下操作: 它接受3个参数:表单名称、datagridview名称和文本框名称前缀 它统计数据网格列 它采用当前行索引 它使数组的长度与列数对应 它在表单中查找所有具有前缀参数+列名的名称的文本框,并在其中设置值 代码: 我的问题是:在某些表单上,我遇到了以下错误: 索引超出了行i的范围。Text=s 当我在文本框中放入其他内容时,错误不会显示,仅当我

我想创建一个类库,其中包含用于常见任务的类

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

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

  • 它接受3个参数:表单名称、datagridview名称和文本框名称前缀
  • 它统计数据网格列
  • 它采用当前行索引
  • 它使数组的长度与列数对应
  • 它在表单中查找所有具有前缀参数+列名的名称的文本框,并在其中设置值
代码:

我的问题是:在某些表单上,我遇到了以下错误:

索引超出了行i的范围。Text=s


当我在文本框中放入其他内容时,错误不会显示,仅当我将s放入文本框时,错误才会显示。

错误可能在行中

For clm = 0 To z
应该是

For clm = 0 To z - 1
列索引的范围为0。。_列的_数-1


更新

您的代码有几个问题:


  • 这个逻辑在我看来是错误的。您正在查找具有正确名称的列(
    clm
    ),但随后获取另一列(
    j
    )的值。为什么?

  • 变量名不会说话,甚至有误导性(例如
    控件的
    i

  • 您具有O(n^2)行为的嵌套循环。看

我建议重写一下。对可能的控件名称使用字典,该字典按名称存储相应的列索引。字典的访问速度几乎是恒定的。换句话说:查找速度非常快

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

我现在修复了它,但它再次给了我这个错误:“索引超出范围。必须是非负的并且小于集合的大小。参数名称:Index”您正在查找具有正确名称的列(clm),但随后获取另一列(j)的值。为什么?你的逻辑有问题吗?谢谢你的帮助。我是使用这些代码的初学者。我使用你的代码并在我的程序中测试它,但仍然给我相同的错误使用调试器跟踪问题。在第一行设置断点(
表示i为整数…
),然后单步执行代码,检查变量等。请参阅。您还可以在
TextChanged
事件处理程序中包含适当的
If
语句,并结合as Boolean标志临时禁用某些逻辑。
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