2013-05-30 61 views
0

当我尝试运行下面的代码我通过代码分析得到错误。调用System.IDisposable.Dispose对象'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 

//错误

失去范围在方法 'TransactionFieldsController.LoadTransactionFieldsGrid(UltraGridBase,收集(中TransactionField),WorkflowsController,布尔值)' 前

CA2000处置对象,对象' cboUltra'不是沿着所有异常路径设置的。调用System.IDisposable.Dispose对象'cboUltra'之前,所有对它的引用超出范围。

为了克服这一点,我重写了代码:

 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

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

请注意,如果您需要为网格中的多个下拉菜单使用相同的数据,那么最好只有该下拉菜单的一个实例并重新使用它。为此,您可以创建一个帮助对象来跟踪UltraCombo的实例,并为特定的LookUpCode返回正确的实例,以及它是否已经创建了请求时的实例。如果这些字段存储在助手对象的字典中,则可以在助手上实现IDisposable,并在助手上调用dispose时处置所有的UltraCombos。然后,您可以在表单上拥有该助手的单个实例,并在表单处理时调用它的dispose。

+0

这很有道理。你可以发布任何示例代码,以适当的方式做到这一点? – iamCR

+0

我可以公开宣布Ultracombo,然后继续?它会说再次处理对象吗? – iamCR

+0

你可以帮助解决这个问题吗? http://stackoverflow.com/questions/16854159/dropdown-should-show-only-the-display-member – iamCR