Partilhar via


Práticas recomendadas para escala o controle DataGridView do Windows Forms

O DataGridView controle foi projetado para fornecer escalabilidade máxima. Se você precisar exibir grandes quantidades de dados, você deve seguir as diretrizes descritas neste tópico para evitar consumindo grandes quantidades de memória ou afetar a capacidade de resposta da interface do usuário (UI). Este tópico discute os seguintes problemas:

  • Usando estilos de célula com eficiência

  • Usando menus de atalho com eficiência

  • Usando o redimensionamento automático com eficiência

  • Usando conjuntos de células, linhas e colunas selecionados com eficiência

  • Usando linhas compartilhadas

  • Impedindo que linhas se tornando descompartilhado.

Se você tiver necessidades especiais de desempenho, você pode implementar o modo virtual e fornecer suas próprias operações de gerenciamento de dados. Para obter mais informações, consulte Modos de exibição de dados no controle DataGridView do Windows Forms.

Usando estilos de célula com eficiência

Cada célula, linha e coluna podem ter suas próprias informações de estilo. Informações de estilo são armazenadas em DataGridViewCellStyle objetos. Criando objetos de estilo de célula para muitos indivíduo DataGridView elementos podem ser ineficientes, especialmente quando se trabalha com grandes quantidades de dados. Para evitar um impacto no desempenho, use as seguintes diretrizes:

Usando Menus de atalho com eficiência

Cada célula, linha e coluna podem ter seu próprio menu de atalho. Menus de atalho do DataGridView controle são representados por ContextMenuStrip controles. Assim como acontece com objetos de estilo de célula, a criação de menus de atalho para o indivíduo muitos DataGridView elementos terão impacto negativo sobre desempenho. Para evitar essa penalidade, use as seguintes diretrizes:

  • Evite criar menus de atalho para células individuais e linhas. Isso inclui o modelo de linha, o que é clonado com o seu menu de atalho quando novas linhas são adicionadas ao controle. Para obter escalabilidade máxima, use somente o controle ContextMenuStrip propriedade para especificar um menu de atalho único para o controle inteiro.

  • Se você precisar vários menus de atalho para várias linhas ou células, lidar com o CellContextMenuStripNeeded ou RowContextMenuStripNeeded eventos. Esses eventos permitem que você a gerenciar os objetos do menu de atalho sozinho, permitindo que você ajustar o desempenho.

Usando o redimensionamento automático com eficiência

Linhas, colunas e cabeçalhos podem ser automaticamente redimensionados como alterações de conteúdo da célula para que todo o conteúdo das células é exibido sem corte. Alterando modos de dimensionamento também pode redimensionar linhas, colunas e cabeçalhos. Para determinar o tamanho correto, o DataGridView controle deve examinar o valor de cada célula que ele deve acomodar. Ao trabalhar com grandes conjuntos de dados, essa análise pode impacto negativo no desempenho do controle quando o redimensionamento automático ocorre. Para evitar penalidades de desempenho, use as seguintes diretrizes:

Para obter mais informações, consulte Opções de controle do Windows Forms DataGridView de dimensionamento..

Usando as células selecionadas, linhas e colunas coleções com eficiência

O SelectedCells coleção não executa com eficiência com grandes seleções. O SelectedRows e SelectedColumns coleções também podem ser ineficientes, embora em menor grau porque há muitos menos linhas de células em um típico DataGridView controle e muitos menos colunas de linhas. Para evitar penalidades de desempenho ao trabalhar com essas coleções, use as seguintes diretrizes:

Usar linhas de compartilhado

Uso eficiente de memória é alcançado na DataGridView controle através de linhas compartilhadas. Linhas irão compartilhar tantas informações sobre sua aparência e comportamento possível pelo compartilhamento de instâncias da DataGridViewRow classe.

Enquanto compartilhamento linha instâncias salva memória, linhas podem facilmente se tornar não compartilhadas. Por exemplo, sempre que um usuário interage diretamente com uma célula, linha fica não compartilhada. Porque não podem ser evitado, as diretrizes neste tópico são úteis somente quando estiver trabalhando com grandes quantidades de dados e somente quando os usuários irão interagir com uma parte relativamente pequena dos dados de cada vez que o programa é executado.

Uma linha não pode ser compartilhada em um não acoplado DataGridView controle se qualquer uma de suas células contêm valores. Quando o DataGridView controle está vinculado a uma fonte de dados externos ou quando você implementa o modo virtual e fornece sua própria fonte de dados, os valores de célula são armazenados fora do controle, em vez de fazê-lo em objetos de célula, permitindo que as linhas a ser compartilhada.

Um objeto de linha só pode ser compartilhado, se o estado de todas as suas células pode ser determinado a partir do estado da linha e os estados das colunas que contêm as células. Se você alterar o estado de uma célula para que ela não pode ser deduzida do estado de sua linha e coluna, a linha não pode ser compartilhada.

Por exemplo, uma linha não pode ser compartilhada em qualquer uma das seguintes situações:

No modo acoplado ou virtual, você pode fornecer dicas de ferramentas, menus de atalho para células individuais, tratamento de CellToolTipTextNeeded e CellContextMenuStripNeeded eventos.

O DataGridView controle automaticamente tentará usar linhas compartilhadas sempre que as linhas são adicionadas para o DataGridViewRowCollection. Use as seguintes diretrizes para garantir que as linhas são compartilhadas:

Para determinar se uma linha é compartilhada, use o DataGridViewRowCollection.SharedRow método para recuperar o objeto de linha e, em seguida, verifique se o objeto Index propriedade. Linhas compartilhadas sempre tem um Index valor da propriedade de – 1.

Impedindo que linhas se tornando descompartilhado.

Linhas compartilhadas podem se tornar não compartilhadas, como resultado de uma ação do usuário ou de código. Para evitar um impacto no desempenho, você deve evitar causando linhas para se tornar não compartilhado. Durante o desenvolvimento de aplicativo, você pode manipular o RowUnshared evento para determinar quando linhas são descompartilhadas. Isso é útil ao depurar problemas de compartilhamento de linha.

Para impedir que linhas se tornando descompartilhado, use as seguintes diretrizes:

  • Evitar a indexação de Rows coleção ou iterar através dela com um foreach loop. Você não normalmente precisarão acessar linhas diretamente. DataGridViewos métodos que operam em linhas levar argumentos de índice de linha em vez de instâncias de linha. Além disso, os manipuladores de eventos relacionados à linha recebem objetos de argumento de evento com propriedades de linha que você pode usar para manipular linhas sem fazendo com que eles se tornem não compartilhado.

  • Se você precisar acessar um objeto de linha, use o DataGridViewRowCollection.SharedRow método e passar índice real. na linha Observe, entretanto, modificando um objeto de linha compartilhada recuperado por meio deste método irá modificar todas as linhas que compartilham este objeto. A linha para novos registros não é compartilhada com outras linhas, no entanto, portanto ela não será afetada quando você modifica qualquer outra linha. Observe também que linhas diferentes, representadas por uma linha compartilhada podem ter menus de atalho diferente. Para recuperar o menu de atalho correta de uma instância de linha compartilhada, use o GetContextMenuStrip método e passar índice real. na linha Se você acessar a linha compartilhada ContextMenuStrip propriedade em vez disso, ele usará o índice de linha compartilhada de -1 e não recuperará o menu de atalho correto.

  • Evitar a indexação de DataGridViewRow.Cells coleção. Acessando uma célula diretamente fará com que sua linha pai para se tornar não compartilhado, instanciar uma nova DataGridViewRow. Manipuladores de eventos relacionados à célula recebem os objetos de argumento de evento com propriedades da célula que você pode usar para manipular as células sem causar linhas para se tornar não compartilhado. Você também pode usar o CurrentCellAddress propriedade para recuperar os índices de linha e coluna da célula atual sem acessar a célula diretamente.

  • Evite os modos de seleção baseada na célula. Esses modos causam linhas para se tornar não compartilhado. Em vez disso, defina a DataGridView.SelectionMode propriedade para DataGridViewSelectionMode.FullRowSelect ou DataGridViewSelectionMode.FullColumnSelect.

  • Não manipulam o DataGridViewRowCollection.CollectionChanged ou DataGridView.RowStateChanged eventos. Esses eventos causam linhas para se tornar não compartilhado. Além disso, não chamar o DataGridViewRowCollection.OnCollectionChanged ou DataGridView.OnRowStateChanged métodos, que disparam esses eventos.

  • Não acesse o DataGridView.SelectedCells coleção quando a DataGridView.SelectionMode valor da propriedade é FullColumnSelect, ColumnHeaderSelect, FullRowSelect, ou RowHeaderSelect. Isso faz com que todas as linhas selecionadas para se tornar não compartilhado.

  • Não chame o DataGridView.AreAllCellsSelected método. Esse método pode causar linhas para se tornar não compartilhado.

  • Não chame o DataGridView.SelectAll método quando o DataGridView.SelectionMode valor da propriedade é CellSelect. Isso faz com que todas as linhas para se tornar não compartilhado.

  • Não defina a ReadOnly ou Selected a propriedade de uma célula para false quando a propriedade correspondente na sua coluna é definida como true. Isso faz com que todas as linhas para se tornar não compartilhado.

  • Não acesse o DataGridViewRowCollection.List propriedade. Isso faz com que todas as linhas para se tornar não compartilhado.

  • Não chame o Sort(IComparer) de sobrecarga da Sort método. Classificação com um comparador personalizado faz com que todas as linhas para se tornar não compartilhado.

Consulte também

Tarefas

Como: Definir estilos de célula padrão para o controle DataGridView do Windows Forms

Referência

DataGridView

Conceitos

Modo virtual no Windows Forms DataGridView Control

Modos de exibição de dados no controle DataGridView do Windows Forms

Estilos de célula em que o controle DataGridView do Windows Forms

Opções de controle do Windows Forms DataGridView de dimensionamento.

Outros recursos

O controle DataGridView do Windows Forms de ajuste de desempenho