2013-05-30 100 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