otimizar atualizações para o DataTable vinculado ao DataGridView

Tenho um formulário no meu aplicativo que exibe alguns dados. Quando mostro o formulário pela primeira vez, carrego alguns dados em uma DataTable e vinculo a DataTable a um DataGridView. Também inicio um método assíncrono que executa algumas consultas mais lentas do banco de dados. Quando essas consultas lentas são concluídas, preciso atualizar algumas centenas de linhas na DataTable, preenchendo os valores retornados das consultas mais lentas, da seguinte forma:

foreach (DataRow row in data.Rows)
{
    SlowLoadingData slow_stuff = slow_query_results[(int)row["id"]];

    row.BeginEdit();
    row[column_one] = slow_stuff.One;
    row[column_two] = slow_stuff.Two;
    row[column_three] = slow_stuff.Three;
    row.EndEdit();
}

Isso é extremamente lento, interrompendo o thread da interface do usuário por um minuto ou mais, provavelmente porque cada linha está acionando um redesenh

Depois de algumas pesquisas, encontrei uma maneira de torná-lo rápido. Primeiro, vincule o DataGridView a um BindingSource que esteja vinculado ao DataTable, em vez de diretamente ao DataTable. Em seguida, faça o seguinte quando fizer alterações no DataTable:

binding_source.SuspendBinding();
binding_source.RaiseListChangedEvents = false;
// foreach (DataRow in Data.Rows) ... code above
binding_source.RaiseListChangedEvents = true;
binding_source.ResumeBinding();
grid.Refresh();

No entanto, existe um problema e é uma confusão: o código acima impede que o DataGridView detecte novas linhas adicionadas ao DataTable. Quaisquer novas linhas adicionadas à tabela não aparecem na grad A grade também pode gerar exceções se você usar as teclas de seta para mover a seleção de célula atual da extremidade inferior da grade, porque a fonte de dados subjacente possui mais linhas, mas a grade não criou linhas para exibi-la

ntão, duas soluções possíveis que eu posso ve

Existe uma maneira melhor de suprimir atualizações de ligação enquanto faz alterações na DataTable subjacent

Existe uma maneira fácil de dizer ao DataGridView para atualizar normalmente sua coleção de linhas da grade para corresponder ao número de linhas DataTable subjacentes? (Nota: tentei chamar BindingSource.ResetBindings, mas parece acionar mais exceções se você tiverremovid linhas da DataTable!)

questionAnswers(7)

yourAnswerToTheQuestion