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

// Ошибка

объекты CA2000 Dispose до потери рамки В методе 'TransactionFieldsController.LoadTransactionFieldsGrid (UltraGridBase, Collection (Of TransactionField), WorkflowsController, Boolean)', объект ' 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 в помощнике и уничтожить все UltraCombos, когда dispose вызывается в помощнике. Тогда у вас может быть один экземпляр этого помощника в вашей форме и вызывать его распоряжаться при удалении формы.

+0

Это имеет смысл. Не могли бы вы разместить какой-либо образец кода, чтобы сделать это надлежащим образом? – iamCR

+0

Могу ли я объявить Ultracombo публично, а затем продолжить? Скажет ли он, что он снова удалит объект? – iamCR

+0

Можете ли вы помочь в этом вопросе? http://stackoverflow.com/questions/16854159/dropdown-should-show-only-the-display-member – iamCR

Смежные вопросы