0

当我尝试运行以下代码时,我通过代码分析得到了错误。

//代码

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)

注意: 网格和行包含值。

有什么解决办法吗?

4

1 回答 1

1

在这种情况下,您不能在方法中释放 UltraCombo 实例,因为网格具有对 UltraCombo 的引用。为了释放您正在创建的 UltraCombo,您需要将它们存储在范围为表单的集合中,并在释放表单时释放它们。这是必要的,因为在方法中为时过早,因为网格仍然需要访问组合。

请注意,如果您需要为网格中的多个下拉菜单使用相同的数据,那么最好只拥有该下拉菜单的一个实例并重复使用它。为此,您可以创建一个帮助器对象,该对象将跟踪 UltraCombo 的实例并为特定的 LookUpCode 返回正确的实例,如果它尚未创建实例,则在请求它时会创建该实例。如果这些存储在帮助器对象的字典中,您可以在帮助器上实现 IDisposable 并在帮助器上调用 dispose 时释放所有 UltraCombos。然后,您可以在表单上拥有此帮助程序的单个实例,并在处置表单时调用它的处置。

于 2013-05-30T14:29:22.790 回答