2012-07-03 3 views
0

У меня есть это логическое в моем коде.Назначение источника данных для исключения исключений источника привязки

Initialize(){ 
    DataGridView view = new DataGridView(); 
    view.BindingSource = bs; 
    bs.dataSource = dataTable; 

    //Fill Data Table using Adapter. 
    da.fill(dataTable); 
} 

CallMeEveryFewMinutes(DataTable dataTable){ 
    List<String> changed = findChangedOjbects(); 
    // Fill datatable2 with changed objects. 
    da2.fill(datatable2, changed)  

    Refresh(dataTable, datatable2); 
    // dataTable is now refreshed. Bind it again so changes are reflected. 

    // ********** PROBLEM AREA *************** 
    // once in a while it throws the below exception. 
    bs.dataSource = dataTable; 
} 

Мало того, он также бросает то же исключение для datagridview.sort (...) - один раз в то время ..

Все указатели будут очень полезны.

System.Reflection.TargetInvocationException: Исключение было выбрано целью вызова. ---> System.ArgumentOutOfRangeException: Указанный аргумент вышел за пределы допустимых значений. Имя параметра: RowIndex на System.Windows.Forms.DataGridView.GetCellDisplayRectangle (Int32 ColumnIndex, Int32 RowIndex, Boolean cutOverflow) в System.Windows.Forms.DataGridView.GetCellAdjustedDisplayRectangle (Int32 ColumnIndex, Int32 RowIndex, Boolean cutOverflow) в системе .Windows.Forms.DataGridView.InvalidateCellPrivate (Int32 ColumnIndex, Int32 RowIndex) на System.Windows.Forms.DataGridView.OnCellCommonChange (Int32, Int32 ColumnIndex RowIndex) на System.Windows.Forms.DataGridView.DataGridViewDataConnection.ProcessListChanged (ListChangedEventArgs е) в System.Windows.Forms.DataGridView.DataGridViewDataConnection.currencyManager_ListChanged (отправитель объекта, ListChangedEventArgs e) в System.Windows.Forms.CurrencyManager.OnListC повешен (ListChangedEventArgs е) в System.Windows.Forms.CurrencyManager.CancelCurrentEdit() в System.Windows.Forms.DataGridView.DataGridViewDataConnection.CancelRowEdit (Boolean restoreRow, булева addNewFinished) в System.Windows.Forms.DataGridView.DataGridViewDataConnection. OnRowValidating (DataGridViewCellCancelEventArgs е) в System.Windows.Forms.DataGridView.OnRowValidating (DataGridViewCell & DataGridViewCell, Int32 ColumnIndex, Int32 RowIndex) на System.Windows.Forms.DataGridView.SetCurrentCellAddressCore (Int32, Int32 ColumnIndex RowIndex, булевой setAnchorCellAddress, булевой validateCurrentCell , Boolean viaMouseClick) в System.Windows.Forms.DataGridView.set_CurrentCell (значение DataGridViewCell) в System.Windows.Forms. DataGridView.OnClearingRows() в System.Windows.Forms.DataGridViewRowCollection.ClearInternal (Boolean) recreateNewRow в System.Windows.Forms.DataGridView.RefreshColumnsAndRows() в System.Windows.Forms.DataGridView.DataGridViewDataConnection.DataSourceMetaDataChanged() на System.Windows.Forms.DataGridView.DataGridViewDataConnection.ProcessListChanged (ListChangedEventArgs е) в System.Windows.Forms.DataGridView.DataGridViewDataConnection.currencyManager_ListChanged (Object отправителя, ListChangedEventArgs е) в System.Windows.Forms.CurrencyManager.OnListChanged (ListChangedEventArgs е) в System.Windows.Forms.CurrencyManager.List_ListChanged (отправитель объекта, ListChangedEventArgs e) в System.Windows.Forms.BindingSource.OnListChanged (L istChangedEventArgs е) в System.Windows.Forms.BindingSource.ResetBindings (Boolean metadataChanged) в System.Windows.Forms.BindingSource.SetList (список IList, Boolean metaDataChanged, Boolean applySortAndFilter) в System.Windows.Forms.BindingSource.ResetList() в System.Windows.Forms.BindingSource.set_DataSource (значение объекта) в Caddie.ViewHelper.MainForm.FormHelper.refreshWorker_RunWorkerCompleted (отправитель объекта, RunWorkerCompletedEventArgs e) в C: \ Project \ Project_1.9 \ WindowsFormsApplication \ ViewHelper \ MainForm \ FormHelper.cs: строка 373 в System.ComponentModel.BackgroundWorker.OnRunWorkerCompleted (RunWorkerCompletedEventArgs e) в System.ComponentModel.BackgroundWorker.AsyncOperationCompleted (Object arg)

ответ

0

Мое предположение заключается в том, что из-за того, что вы изменяете данные и переписываете их на элемент управления, вызывается какое-то событие, которое слушает саму сетку. Будь то SelectionChanged или, может быть, RowRemoved, вы в основном пытаетесь запустить эти вызовы с Gridview без каких-либо данных.

Проверьте, есть ли у вас вызовы методов, которые будут пытаться получить доступ к данным в вашей сетке. Вы могли бы даже добавить некоторые точки останова в своей программе, чтобы увидеть, в каком порядке эти методы вызывают. Когда происходит повторная проверка, смотрите порядок, в котором вызывается код.

Чтобы исправить это, прослушиватели событий проверяют, равен или нет dgv.Rows.Count равен 0 или нет.

+0

Благодаря носовой ответа, я обнаружил, что вместо подмены той же таблицы данных для связывания источника, мы должны вместо «сброса привязок» это позволяет управлять (вид сетки данных), чтобы обновить их содержимое, прежде чем что-либо другой исполняет (как слушатели) – karephul

0

Я нашел очень хороший намек от

http://social.msdn.microsoft.com/forums/en-US/winformsdatacontrols/thread/279d3c64-c1c2-4927-b0cc-79866c09e035/

«Я понял это, но размещены на другом потоке. В основном валютный менеджер, который сделал свой собственный индекс данных, выходит из-Вак В моем объекте коллекции я позволил себе передать объект datagridview, чтобы, если что-то удалено, я могу вызвать bindmanager.resetcurrentbindings. Если вы сбросите привязки после удаления, это позволит избежать этой ошибки. "

Итак, я немного изменил свой код, и проблема (выглядит) теперь разрешена.

Initialize(){ 
    DataGridView view = new DataGridView(); 
    view.BindingSource = bs; 
    bs.dataSource = dataTable; 

    //Fill Data Table using Adapter. 
    da.fill(dataTable); 
} 

CallMeEveryFewMinutes(DataTable dataTable){ 
    List<String> changed = findChangedOjbects(); 
    // Fill datatable2 with changed objects. 
    da2.fill(datatable2, changed)  

    Refresh(dataTable, datatable2); 
    // dataTable is now refreshed. Bind it again so changes are reflected. 

    // ********** PROBLEM AREA -- SOLVED *************** 
    // once in a while it throws the below exception. 
    //bs.dataSource = dataTable; don't rebind the same datatable, but rather reset the bindings. 
    bs.ResetBindings(false); 
} 
Смежные вопросы