我需要更改表单上所有TableAdapter的超时值 . 我有一个适用于单个组件的函数,但是当我尝试从表单创建的组件列表中传入值时,它不起作用 . 我得到“对象引用未设置为对象的实例” . 对于列表中的项目 . 该错误来自TableAdapterCommandTimeout函数,当我在表单上传递普通组件(表单设计器上的TableAdapter1)时,这是有效的 . 任何帮助将不胜感激,谢谢 .
' main function code
Public Sub GetComponents(ByVal frm As Form)
Dim comsList = GetTableAdapterList(frm)
For Each item As Component In comsList
TableAdapterCommandTimeout(item, 300)
Next
End Sub
' code to get list of Table Adapters
Public Function GetTableAdapterList(ByVal frm As Form) As List(Of Component)
Dim components As New List(Of Component)
Dim fieldInfos() As FieldInfo = frm.GetType.GetFields(BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.DeclaredOnly)
For Each f As FieldInfo In fieldInfos
If f.FieldType.BaseType Is GetType(Component) Then
Dim c As Component = TryCast(f.GetValue(frm), Component)
If c IsNot Nothing And c.ToString.Contains("TableAdapter") AndAlso Not c.ToString.Contains("TableAdapterManager") Then components.Add(c)
End If
Next
Return components
End Function
' code to update timeout
Public Shared Sub TableAdapterCommandTimeout(Of T As Global.System.ComponentModel.Component)(ByRef TableAdapter As T, CommandTimeout As Integer)
If (TableAdapter IsNot Nothing) Then
Dim pi = GetType(T).GetProperty("CommandCollection", BindingFlags.NonPublic Or BindingFlags.GetProperty Or BindingFlags.Instance).GetValue(TableAdapter, Nothing)
If pi IsNot Nothing Then
For Each c In TryCast(pi, System.Data.SqlClient.SqlCommand())
If (c IsNot Nothing) Then
c.CommandTimeout = CommandTimeout
End If
Next
End If
End If
End Sub