Práticas recomendadas para escala o controle DataGridView do Windows Forms
The 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 isso consuma uma grande quantidade de memória ou comprometer a capacidade de resposta da interface do usuário (UI).Este tópico discute os seguintes problemas:
Usando estilos de célula de maneira eficiente
Usando menus de atalho com eficiência
Usando o redimensionamento automático com eficiência
Usando as coleções de células, linhas e colunas selecionadas com eficiência
Usando linhas compartilhadas
Impedindo a 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 para muitos individuais de célulaDataGridView elementos podem ser ineficientes, especialmente quando se trabalha com grandes quantidades de dados. Para evitar um impacto no desempenho, use as diretrizes a seguir:
Evitar configuração propriedades de estilo individuais de célulaDataGridViewCell ou DataGridViewRow objetos. Isso inclui o objeto de linha especificado pelo RowTemplate propriedade. Cada nova linha clonado de modelo linha receberá sua própria cópia do objeto de estilo de célula do modelo.Para escalabilidade máxima, conjunto propriedades de estilo de célula no DataGridView nível. Por exemplo, conjunto o DataGridView.DefaultCellStyle propriedade em vez da DataGridViewCell.Style propriedade.
Se algumas células requerem formatação diferentes de formatação padrão, use o mesmo DataGridViewCellStyle instância entre grupos de células, linhas ou colunas. Evitar diretamente configuração propriedades do tipo DataGridViewCellStyle em células individuais, linhas e colunas. Para obter um exemplo de compartilhamento de estilo de célula, consulte Como: conjunto estilos de célula padrão para o Windows Forms DataGridView controle. Você também pode evitar uma penalidade de desempenho ao definir estilos de célula individualmente, manipulando o CellFormatting manipulador de eventos. Para um exemplo, consulte Como: Personalizar a formatação de dados no controle do Windows Forms DataGridView.
Ao determinar o estilo da célula, use o DataGridViewCell.InheritedStyle propriedade em vez da DataGridViewCell.Style propriedade. Acessando o Style propriedade cria uma nova instância das DataGridViewCellStyle classe se a propriedade já não tiver sido usada. Além disso, esse objeto pode não conter as informações de estilo completo para a célula se alguns estilos são herdados da linha, coluna ou controle.Para obter mais informações sobre herança de estilo de célula, consulte Estilos de célula no Windows Forms DataGridView controle.
Usando menus de atalho com eficiência
Cada célula, linha e coluna podem ter seu próprio menu de atalho.Menus de atalho no DataGridView controle são representados por ContextMenuStrip controles. Assim sistema autônomo com objetos de estilo de célula, Criando menus de atalho para muitos individuais DataGridView elementos serão afetam negativamente a velocidade. Para evitar essa penalidade, use as diretrizes a seguir:
Evite criar menus de atalho para células individuais e linhas.Isso inclui o modelo de linha, que é clonado junto com seu menu de atalho quando novas linhas são adicionadas ao controle.Para máxima escalabilidade, use apenas ContextMenuStrip propriedade para especificar um menu de atalho único para todo o controle.
Se você precisar de vários menus de atalho para várias linhas ou células, lidar com o CellContextMenuStripNeeded ou RowContextMenuStripNeeded eventos. Esses eventos permitem que você gerenciar os objetos do menu de atalho sozinho, permitindo que você ajuste o desempenho.
Usando o redimensionamento automático com eficiência
Linhas, colunas e cabeçalhos podem ser automaticamente redimensionados sistema autônomo alterações de Sumário da célula para que todo o Sumário de células é exibido sem corte.Alterando modos de dimensionamento também pode redimensionar linhas, colunas e cabeçalhos.Para determinar o dimensionar correto, a DataGridView controle deve examinar o valor de cada célula deve acomodar. Ao trabalhar com grandes conjuntos de dados, essa análise negativamente pode afetar o desempenho do controle quando o redimensionamento automático ocorre.Para evitar penalidades de desempenho, use as diretrizes a seguir:
Evite usar o dimensionamento automático em um DataGridView controlar um grande conjunto de linhas. Se você usa o dimensionamento automático, somente o redimensionar com base em linhas exibidas.Use apenas sistema autônomo linhas exibidas no modo virtual também.
Para linhas e colunas, use o DisplayedCells ou DisplayedCellsExceptHeaders campo de DataGridViewAutoSizeRowsMode, DataGridViewAutoSizeColumnsMode, e DataGridViewAutoSizeColumnMode enumerações.
Para cabeçalhos de linha, use o AutoSizeToDisplayedHeaders ou AutoSizeToFirstHeader campo de DataGridViewRowHeadersWidthSizeMode enumeração.
Para máxima escalabilidade, desative o dimensionamento automático e redimensionamento através de programação.
Para obter mais informações, consulte Opções no Windows Forms DataGridView controle de dimensionamento.
Usando as células selecionadas, linhas e colunas coleções com eficiência
The SelectedCells coleção não executa com eficiência grandes seleções. The SelectedRows e SelectedColumns coleções também podem ser ineficientes, embora em menor grau porque há muitos menos linhas de células em uma típica DataGridView controle e muito menos colunas que linhas. Para evitar penalidades de desempenho ao trabalhar com essas coleções, use as diretrizes a seguir:
Para determinar se todas as células no DataGridView foram selecionadas antes de acessar o Sumário das SelectedCells coleção, verificar o valor retornado a AreAllCellsSelected método. Observe, entretanto, esse método pode fazer com que linhas para se tornar não compartilhado.Para mais informações, veja a próxima seção.
Evite usar o Count propriedade das System.Windows.Forms.DataGridViewSelectedCellCollection para determinar o número de células selecionadas. Em vez disso, use o DataGridView.GetCellCount método e passe a DataGridViewElementStates.Selected valor. Da mesma forma, usar o DataGridViewRowCollection.GetRowCount e DataGridViewColumnCollection.GetColumnCount métodos para determinar o número de elementos selecionados, em vez de acessar as coleções de linha e coluna selecionadas.
Evite modos de seleção baseada em célula.Em vez disso, conjunto o DataGridView.SelectionMode propriedade para DataGridViewSelectionMode.FullRowSelect ou DataGridViewSelectionMode.FullColumnSelect.
Usando linhas compartilhados
Uso eficiente de memória é alcançado no DataGridView o controle por meio compartilhado linhas. Linhas irão compartilhar o máximo de informações sobre sua aparência e comportamento possível compartilhando instâncias do DataGridViewRow classe.
Enquanto o compartilhamento de instâncias de linha salva memória, linhas podem com com facilidade se tornar não compartilhadas.Por exemplo, sempre que um usuário interage diretamente com uma célula, se sua linha torna não compartilhada.Porque isso não pode 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 dos dados relativamente pequena toda vez que o programa é executado.
Uma linha não pode ser compartilhada em um não acoplado DataGridView controle se qualquer uma das suas células contiverem valores. Quando o DataGridView controle é limite a uma fonte de dados externa ou ao implementar o modo virtual e fornecer sua própria fonte de dados, os valores das células são armazenados fora do controle em vez de 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 de estado de linha e os estados de colunas que contêm as células.Se você alterar o estado de uma célula para que não pode ser deduzido do estado da 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:
A linha contém uma única célula selecionada que não está em uma coluna selecionada.
A linha contiver uma célula com o seu ToolTipText ou ContextMenuStrip conjunto propriedades.
A linha contiver um DataGridViewComboBoxCell com seu Items conjunto de propriedades.
No modo limite ou modo virtual, você pode fornecer menus de dicas de ferramenta e atalho para células individuais, manipulando o CellToolTipTextNeeded e CellContextMenuStripNeeded eventos.
The DataGridView controle tentará automaticamente utilizar linhas compartilhadas sempre que linhas são adicionadas à DataGridViewRowCollection. Use as diretrizes a seguir para garantir que as linhas são compartilhadas:
Evitar chamando o Add(Object[]) sobrecarga da Add método e o Insert(Object[]) sobrecarga da Insert método para o DataGridView.Rows coleção. Essas sobrecargas criam automaticamente linhas não compartilhadas.
Certifique-se de que a linha especificada no DataGridView.RowTemplate propriedade pode ser compartilhada nos seguintes casos:
Ao chamar o Add() ou Add(Int32) sobrecargas da Add método ou a Insert(Int32,Int32) sobrecarga da Insert método para o DataGridView.Rows coleção.
Quando aumentar o valor do DataGridView.RowCount propriedade.
Ao definir o DataGridView.DataSource propriedade.
Certifique-se de que a linha indicada pelo indexSource parâmetro pode ser compartilhado ao chamar o AddCopy, AddCopies, InsertCopy, e InsertCopies métodos para o DataGridView.Rows coleção.
Certifique-se de que a linha ou linhas especificadas podem ser compartilhadas ao chamar o Add(DataGridViewRow) sobrecarga da Add método, o AddRange método, o Insert(Int32,DataGridViewRow) sobrecarga da Insert método e o InsertRange método para o DataGridView.Rows coleção.
Para determinar se uma linha é compartilhada, use o DataGridViewRowCollection.SharedRow método para recuperar o objeto de linha e, em seguida, verifique o objeto Index propriedade. Linhas compartilhadas sempre têm um Index valor da propriedade de – 1.
Impedindo a linhas se tornar descompartilhado
Linhas compartilhadas podem se tornar não compartilhadas sistema autônomo resultado de ação do usuário ou código.Para evitar um impacto no desempenho, você deve evitar fazendo com que linhas para se tornar não compartilhado.Durante o desenvolvimento de aplicativos, você pode manipular o RowUnshared evento para determinar quando linhas são descompartilhadas. Isso é útil ao depurar problemas de compartilhamento de linha.
Para impedir linhas se tornando descompartilhado, use as diretrizes a seguir:
Evitar a indexação de Rows coleção ou iterar através dela com um foreach loop. Não será necessário normalmente para acesso linhas diretamente.DataGridView métodos que operam em linhas ter argumentos de índice de linha em vez de instâncias de linha. Além disso, os manipuladores para eventos relacionados à linha receber objetos de argumento de evento com propriedades de linha que você pode usar para manipular linhas sem fazer com que eles se tornem não compartilhado.
Se você precisar acesso uma linha de objeto, use o DataGridViewRowCollection.SharedRow método e passe índice real da linha. Observe, entretanto, modificando um objeto de linha compartilhada recuperado por meio desse método que irá modificar todas as linhas que compartilham este objeto.A linha para novos registros não é compartilhada com outras linhas, no entanto, para que ele não será afetado quando você modifica qualquer Outros linha.Observe também que linhas diferentes, representadas por uma linha compartilhada podem ter menus de atalho diferente.Para recuperar o menu de atalho correto da instância de uma linha compartilhada, use o GetContextMenuStrip método e passe índice real da linha. Se você acesso ContextMenuStrip propriedade em vez disso, ele usará o índice da linha compartilhada-1 e não recuperará o menu de atalho correto.
Evitar a indexação de DataGridViewRow.Cells coleção. Acessar diretamente uma célula fará com que sua linha pai para se tornar não compartilhado, instanciar um novo DataGridViewRow. Manipuladores para eventos relacionados à célula recebem objetos de argumento de evento com propriedades de 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 corrente sem acessar diretamente na célula.
Evite modos de seleção baseada em célula.Esses modos de fazer com que linhas para se tornar não compartilhado.Em vez disso, conjunto o DataGridView.SelectionMode propriedade para DataGridViewSelectionMode.FullRowSelect ou DataGridViewSelectionMode.FullColumnSelect.
Não manipulam o DataGridViewRowCollection.CollectionChanged ou DataGridView.RowStateChanged eventos. Esses eventos fazem com que linhas para se tornar não compartilhado.Além disso, não telefonar o DataGridViewRowCollection.OnCollectionChanged ou DataGridView.OnRowStateChanged métodos disparam esses eventos.
Não acesso o DataGridView.SelectedCells coleção quando o 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 telefonar o DataGridView.AreAllCellsSelected método. Esse método pode fazer com que linhas para se tornar não compartilhado.
Não telefonar 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 o ReadOnly ou Selected propriedade de uma célula para false Quando a propriedade correspondente na sua coluna é definida 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) 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: conjunto estilos de célula padrão para o Windows Forms DataGridView controle
Conceitos
Modo virtual no Windows Forms DataGridView controle
Modos de exibição de dados no controle DataGridView do Windows Forms
Estilos de célula no Windows Forms DataGridView controle
Opções no Windows Forms DataGridView controle de dimensionamento