2014-10-23 22 views
5

Mam funkcję, która jest wywoływana z cell_endedit. Porusza się dataGridViewRow wewnątrz DataGridView:Jak uniknąć ponownego wywołania do setCurrentCellAddressCore?

private void moveRowTo(DataGridView table, int oldIndex, int newIndex) 
{ 
    if (newIndex < oldIndex) 
    { 
     oldIndex += 1; 
    } 
    else if (newIndex == oldIndex) 
    { 
     return; 
    } 
    table.Rows.Insert(newIndex, 1); 
    DataGridViewRow row = table.Rows[newIndex]; 
    DataGridViewCell cell0 = table.Rows[oldIndex].Cells[0]; 
    DataGridViewCell cell1 = table.Rows[oldIndex].Cells[1]; 
    row.Cells[0].Value = cell0.Value; 
    row.Cells[1].Value = cell1.Value; 
    table.Rows[oldIndex].Visible = false; 
    table.Rows.RemoveAt(oldIndex); 
    table.Rows[oldIndex].Selected = false; 
    table.Rows[newIndex].Selected = true; 
} 

w rzędzie table.Rows.Insert (newIndex, 1) pojawia się następujący błąd:

Unhandled exception of type "System.InvalidOperationException" in System.Windows.Forms.dll

Additional data: Operation is not valid because it results in a reentrant call to the SetCurrentCellAddressCore function.

to się dzieje, gdy kliknę inną komórkę w procesie edytowanie bieżącej komórki. Jak uniknąć tego błędu i czy mój wiersz został poprawnie wstawiony?

Odpowiedz

15

Ten błąd jest spowodowany przez

Any operation that results in the active cell being changed while the DataGridView is still using it

jako przyjęty odpowiedź in this post.

Poprawka (sprawdziłem): użyj BeginInvoke, aby zadzwonić pod numer moveRowTo.

private void dataGridView2_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
{ 
    this.BeginInvoke(new MethodInvoker(() => 
     { 
      moveRowTo(dataGridView2, 0, 1); 
     })); 
} 

BeginInvoke jest asynchroniczne wywołanie, więc dataGridView2_CellEndEdit wraca natychmiast, a metoda moveRowTo jest wykonywane po tym, w tym czasie nie jest już dataGridView2 użyciu aktualnie aktywną komórkę.

-1
if (
    (datagridview.SelectedCells[0].RowIndex != datagridview.CurrentCell.RowIndex) || 
    (datagridview.SelectedCells[0].ColumnIndex!= datagridview.CurrentCell.ColumnIndex) 
    ) { return; } 
+1

Chociaż ten kod może odpowiedzieć na pytanie, podanie dodatkowego kontekstu dotyczącego sposobu i/lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi. –