当我尝试运行下面的代码时,我通过代码分析得到错误。
//代码
For Each UltraGridRow In transactionFieldsGrid.Rows.GetAllNonGroupByRows()
If (Field.FieldTypeId = 1000) Then
Dim cboUltra = New UltraCombo()
cboUltra.DataSource = LoadLookupMulticolumn(Field.LookUpCode)
UltraGridRow.Cells("FieldValue").ValueList = cboUltra
EndIf
Next
//错误
CA2000在方法'TransactionFieldsController '中失去作用域之前处理对象。LoadTransactionFieldsGrid(UltraGridBase, Collection(Of TransactionField), WorkflowsController, Boolean)',对象'cboUltra'不沿所有异常路径处置。在对象'cboUltra'的所有引用都超出作用域之前,调用System.IDisposable.Dispose。
为了克服这个问题,我将代码重写为: For Each UltraGridRow In transactionFieldsGrid.Rows.GetAllNonGroupByRows()
If (Field.FieldTypeId = 1000) Then
Using cboUltra As New UltraCombo()
cboUltra.DataSource = LoadLookupMulticolumn(Field.LookUpCode)
UltraGridRow.Cells("FieldValue").ValueList = cboUltra
End Using
EndIf
Next
但是当我尝试像上面的代码。当下面的行被执行时,我得到了一个Object reference error
。
transactionFieldsGrid.ActiveRow = transactionFieldsGrid.Rows.GetRowAtVisibleIndex(0)
注意:网格和行包含值。
解决方案吗?
在这种情况下,您不能在方法中处置UltraCombo实例,因为网格有对UltraCombo的引用。要处置正在创建的UltraCombo,需要将它们存储在窗体的集合作用域中,并在窗体处置时处置它们。这是必要的,因为在方法中太早了,因为网格仍然需要访问组合。
注意,如果您需要在网格中的多个下拉列表中使用相同的数据,那么最好只拥有该下拉列表的一个实例并重用它。为此,您可以创建一个助手对象,它将跟踪UltraCombo的实例并返回特定LookUpCode的正确实例,如果它还没有创建实例,它将在请求时创建实例。如果这些存储在helper对象中的字典中,则可以在helper上实现IDisposable,并在调用该helper上的dispose时处置所有的ultracombo。然后,您可以在窗体上拥有此帮助程序的单个实例,并在窗体被处置时调用其处置。