在对对象'cboUltra'的所有引用都超出范围之前,调用System.IDisposable.Dispose

时间:2013-05-30 14:02:47

标签: vb.net code-analysis infragistics ultragrid

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

//代码

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)

注意:网格和行包含值。

任何解决方案?

1 个答案:

答案 0 :(得分:1)

在这种情况下,您无法在方法中部署UltraCombo实例,因为网格引用了UltraCombo。要处理您正在创建的UltraCombo,您需要将它们存储在作用于表单的集合中,并在处理表单时将其处理掉。这是必要的,因为在该方法中太早,因为网格仍然需要访问组合。

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