当我尝试运行以下代码时,我通过代码分析得到错误。
//代码
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)
注意:网格和行包含值。
任何解决方案?
答案 0 :(得分:1)
在这种情况下,您无法在方法中部署UltraCombo实例,因为网格引用了UltraCombo。要处理您正在创建的UltraCombo,您需要将它们存储在作用于表单的集合中,并在处理表单时将其处理掉。这是必要的,因为在该方法中太早,因为网格仍然需要访问组合。
请注意,如果您需要对网格中的多个下拉列表使用相同的数据,那么最好只有一个该下拉列表的实例并重复使用它。为此,您可以创建一个帮助对象,该对象将跟踪UltraCombo的实例并返回特定LookUpCode的正确实例,如果它尚未创建实例,则会在请求时生成。如果这些存储在辅助对象的字典中,则可以在帮助程序上实现IDisposable,并在辅助程序上调用dispose时处置所有UltraCombos。然后,您可以在表单上拥有此帮助程序的单个实例,并在处理表单时调用其处置。