调用 System.IDisposable.在对象 'cboUltra' 上的所有引用都超出范围之前对其进行处置



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

//代码

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。然后,您可以在窗体上拥有此帮助程序的单个实例,并在窗体被处置时调用其处置。

相关内容

  • 没有找到相关文章

最新更新