2013-12-12 29 views
0

我想創建一個包含常見任務類的類庫。如何通過製作classLibrary點擊gridview後填充所有文本框?

我做了這樣一個類,在某些形式上工作得很好,但它有一些我無法追查的錯誤。

這是我的代碼,並執行以下操作:

  • 它接受3個參數:表單名稱,datagridview的名稱和文本框中的名稱前綴。
  • 它統計的數據網格列
  • 它採用當前行的索引
  • 它與對應的列數
  • 它看起來的形式有一個名字的所有文本框的長度數組prefix參數+列名,並在其中設置的值

代碼:

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 

我的問題是:在某些形式我得到這個錯誤:

Index is out of range for line i.Text = s

誤差不出來,當我把別的東西在我的文本框,當我把,它出現的錯誤纔會出現。

回答

2

該錯誤可能是在該行

For clm = 0 To z 

它應顯示

For clm = 0 To z - 1 

列索引範圍是從0 .. number_of_columns - 1.


UPDATE

有幾個問題與您的代碼:

  • 的邏輯似乎我錯了。您正在尋找具有正確名稱的列(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 
+0

我現在修正了它,但它再次給我這個錯誤:「索引超出範圍。必須是非負數且小於集合的大小。 參數名稱:索引「 – 2013-12-13 00:38:10

+0

您正在尋找正確名稱的列(clm),但是取另一列(j)的值。爲什麼?您的邏輯沒有問題? –

+0

感謝您的幫助。我使用這些代碼的初學者,我使用你的代碼並在我的程序中測試它,但仍然給我同樣的錯誤 –

相關問題