Práticas recomendadas para colocação em escala do controle DataGridView dos Windows Forms
O DataGridView controle é projetado para fornecer escalabilidade máxima. Se você precisa exibir grandes quantidades de dados, siga as diretrizes descritas neste tópico para evitar o consumo de grandes quantidades de memória ou prejudicar a capacidade de resposta da UI (interface do usuário). 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 as coleções de células, linhas e colunas selecionadas com eficiência
Usando linhas compartilhadas
Impedindo as linhas de se tornarem não compartilhadas
Se você tiver necessidades de desempenho especiais, implemente o modo virtual e forneça suas próprias operações de gerenciamento de dados. Para obter mais informações, consulte Modos de exibição dos dados no controle DataGridView dos Windows Forms.
Usando Estilos de Célula com Eficiência
Cada célula, linha e coluna pode ter suas próprias informações de estilo. As informações de estilo são armazenadas em DataGridViewCellStyle objetos. Criar objetos de estilo de célula para muitos elementos individuais DataGridView pode ser ineficiente, especialmente ao trabalhar com grandes quantidades de dados. Para evitar um impacto no desempenho, use as seguintes diretrizes:
Evite definir propriedades de estilo de célula para objetos individuais ou DataGridViewRow individuaisDataGridViewCell. Isso inclui o objeto de linha especificado pela RowTemplate propriedade. Cada nova linha que é clonada do modelo de linha receberá sua própria cópia do objeto de estilo de célula do modelo. Para obter escalabilidade máxima, defina as propriedades de estilo de célula no DataGridView nível. Por exemplo, defina a DataGridView.DefaultCellStyle propriedade em vez da DataGridViewCell.Style propriedade.
Se algumas células exigirem formatação diferente da formatação padrão, use a mesma DataGridViewCellStyle instância em grupos de células, linhas ou colunas. Evite definir diretamente propriedades do tipo DataGridViewCellStyle em células, linhas e colunas individuais. Para obter um exemplo de compartilhamento de estilo de célula, consulte Instruções: definir estilos de célula padrão para o controle DataGridView dos Windows Forms. Você também pode evitar uma penalidade de desempenho ao definir estilos de célula individualmente manipulando o manipulador de CellFormatting eventos. Para obter um exemplo, consulte Instruções: personalizar a formatação de dados no controle DataGridView dos Windows Forms.
Ao determinar o estilo de uma célula, use a DataGridViewCell.InheritedStyle propriedade em vez da DataGridViewCell.Style propriedade. O acesso à Style propriedade cria uma nova instância da DataGridViewCellStyle classe se a propriedade ainda não tiver sido usada. Além disso, esse objeto poderá não conter as informações de estilo completas para a célula se alguns estilos forem herdados da linha, da coluna ou do controle. Para obter mais informações sobre herança de estilo de célula, consulte Estilos de célula no controle DataGridView dos Windows Forms.
Usando Menus de Atalho com Eficiência
Cada célula, linha e coluna pode ter seu próprio menu de atalho. Os menus de DataGridView atalho no 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 muitos elementos individuais DataGridView afetará negativamente o desempenho. Para evitar essa penalidade, use as seguintes diretrizes:
Evite criar menus de atalho para células e linhas individuais. Isso inclui o modelo de linha, que é clonado juntamente com o menu de atalho quando novas linhas são adicionadas ao controle. Para obter escalabilidade máxima, use apenas a propriedade do controle para especificar um único menu de ContextMenuStrip atalho para todo o controle.
Se você precisar de vários menus de atalho para várias linhas ou células, manipule os CellContextMenuStripNeeded eventos ou RowContextMenuStripNeeded . Esses eventos permitem gerenciar os objetos do menu de atalho por conta própria, possibilitando ajustar o desempenho.
Usando o Redimensionamento Automático com Eficiência
Cabeçalhos, colunas e linhas podem ser redimensionados automaticamente como alterações de conteúdo da célula para que todo o conteúdo das células seja exibido sem recorte. Alterar os modos de dimensionamento também pode redimensionar linhas, colunas e cabeçalhos. Para determinar o tamanho correto, o controle deve examinar o DataGridView valor de cada célula que ele deve acomodar. Ao trabalhar com grandes conjuntos de dados, essa análise poderá afetar negativamente o desempenho do controle quando o redimensionamento automático ocorrer. Para evitar penalidades de desempenho, use as seguintes diretrizes:
Evite usar o dimensionamento automático em um controle com um DataGridView grande conjunto de linhas. Se você usar o dimensionamento automático, redimensione apenas com base nas linhas exibidas. Além disso, use apenas as linhas exibidas no modo virtual.
Para linhas e colunas, use o
DisplayedCells
campo ouDisplayedCellsExceptHeaders
das DataGridViewAutoSizeRowsModeenumerações , DataGridViewAutoSizeColumnsModee DataGridViewAutoSizeColumnMode .Para cabeçalhos de linha, use o AutoSizeToDisplayedHeaders campo ou AutoSizeToFirstHeader da DataGridViewRowHeadersWidthSizeMode enumeração.
Para obter escalabilidade máxima, desligue o dimensionamento automático e use o redimensionamento programático.
Para obter mais informações, consulte Sizing Options in the Windows Forms DataGridView Control (Opções de dimensionamento no controle DataGridView dos Windows Forms).
Usando as Coleções de Células, Linhas e Colunas Selecionadas com Eficiência
A SelectedCells coleção não funciona de forma eficiente com grandes seleções. As SelectedRows coleções e também podem ser ineficientes, embora em menor grau porque há muito menos linhas do que células em um controle típico DataGridView e SelectedColumns muito menos colunas do que linhas. Para evitar penalidades de desempenho ao trabalhar com essas coleções, use as seguintes diretrizes:
Para determinar se todas as células no DataGridView foram selecionadas antes de acessar o SelectedCells conteúdo da coleção, verifique o valor de retorno do AreAllCellsSelected método. No entanto, observe que esse método pode fazer com que as linhas se tornem não compartilhadas. Para obter mais informações, consulte a próxima seção.
Evite usar a Count propriedade de para System.Windows.Forms.DataGridViewSelectedCellCollection determinar o número de células selecionadas. Em vez disso, use o método e passe o DataGridView.GetCellCountDataGridViewElementStates.Selected valor. Da mesma forma, use os DataGridViewRowCollection.GetRowCount métodos e para determinar o número de elementos selecionados, em vez de acessar as coleções de linhas e DataGridViewColumnCollection.GetColumnCount colunas selecionadas.
Evite modos de seleção com base em célula. Em vez disso, defina a DataGridView.SelectionMode propriedade como DataGridViewSelectionMode.FullRowSelect ou DataGridViewSelectionMode.FullColumnSelect.
Usando Linhas Compartilhadas
O uso eficiente de memória é obtido no controle por meio de DataGridView linhas compartilhadas. As linhas compartilharão o máximo possível de informações sobre sua aparência e comportamento compartilhando instâncias da DataGridViewRow classe.
Embora o compartilhamento de instâncias de linha poupe memória, as linhas podem facilmente se tornar não compartilhadas. Por exemplo, sempre que um usuário interage diretamente com uma célula, sua linha se torna não compartilhada. Como isso não pode ser evitado, as diretrizes neste tópico são úteis somente ao trabalhar com grandes quantidades de dados e somente quando os usuários forem interagir com uma parte relativamente pequena dos dados sempre que o programa for executado.
Uma linha não pode ser compartilhada em um controle não acoplado DataGridView se qualquer uma de suas células contiver valores. Quando o controle é vinculado a uma fonte de dados externa ou quando você implementa o DataGridView modo virtual e fornece sua própria fonte de dados, os valores de célula são armazenados fora do controle em vez de em objetos de célula, permitindo que as linhas sejam compartilhadas.
Um objeto de linha poderá ser compartilhado apenas se o estado de todas as suas células puder ser determinado por meio do estado da linha e dos estados das colunas que contêm as células. Se você alterar o estado de uma célula para que ela não possa mais ser deduzida por meio do estado de sua linha e coluna, a linha não poderá ser compartilhada.
Por exemplo, uma linha não pode ser compartilhada em nenhuma das seguintes situações:
A linha contém uma única célula selecionada que não está em uma coluna selecionada.
A linha contém uma célula com seu ToolTipText ou ContextMenuStrip propriedades definidas.
A linha contém um DataGridViewComboBoxCell com seu Items conjunto de propriedades.
No modo acoplado ou no modo virtual, você pode fornecer dicas de ferramentas e menus de atalho para células individuais manipulando os CellToolTipTextNeeded eventos e CellContextMenuStripNeeded .
O DataGridView controle tentará usar automaticamente linhas compartilhadas sempre que linhas forem adicionadas ao DataGridViewRowCollection. Use as diretrizes a seguir para garantir que as linhas sejam compartilhadas:
Evite chamar a sobrecarga do Add método e a
Add(Object[])
Insert(Object[])
sobrecarga do Insert método da DataGridView.Rows coleção. Essas sobrecargas criam linhas não compartilhadas automaticamente.Certifique-se de que a linha especificada na DataGridView.RowTemplate propriedade pode ser compartilhada nos seguintes casos:
Ao chamar o
Add()
ou sobrecargas do Add método ouAdd(Int32)
aInsert(Int32,Int32)
sobrecarga do Insert método da DataGridView.Rows coleção.Ao aumentar o valor do DataGridView.RowCount imóvel.
Ao definir a DataGridView.DataSource propriedade.
Certifique-se de que a
indexSource
linha indicada pelo parâmetro possa ser compartilhada ao chamar os AddCopymétodos , , AddCopiesInsertCopye InsertCopies da DataGridView.Rows coleção.Certifique-se de que a linha ou linhas especificadas possam ser compartilhadas ao chamar a sobrecarga do método, o AddRange método, a
Insert(Int32,DataGridViewRow)
Add(DataGridViewRow)
Add sobrecarga do Insert método e o InsertRangeDataGridView.Rows método da coleção.
Para determinar se uma linha é compartilhada, use o método para recuperar o DataGridViewRowCollection.SharedRow objeto de linha e, em seguida, verifique a propriedade do Index objeto. As linhas compartilhadas sempre têm um Index valor de propriedade de –1.
Impedindo as Linhas de se Tornarem Não Compartilhadas
As linhas compartilhadas podem se tornar não compartilhadas como resultado da ação de usuário ou de código. Para evitar um impacto no desempenho, evite fazer com que as linhas se tornem não compartilhadas. Durante o desenvolvimento do aplicativo, você pode manipular o RowUnshared evento para determinar quando as linhas não são compartilhadas. Isso é útil ao depurar problemas de compartilhamento de linhas.
Para impedir que as linhas se tornem não compartilhadas, use as seguintes diretrizes:
Evite indexar a Rows coleção ou iterá-la com um
foreach
loop. Normalmente não será necessário acessar as linhas diretamente. DataGridView Os métodos que operam em linhas usam 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 fazer com que elas se tornem não compartilhadas.Se você precisar acessar um objeto de linha, use o método e passe o DataGridViewRowCollection.SharedRow índice real da linha. Observe, entretanto, que modificar um objeto de linha compartilhada recuperado por esse método modificará todas as linhas que compartilham esse objeto. A linha para novos registros não é compartilhada com outras linhas, no entanto, ela não será afetada quando você modificar qualquer outra linha. Observe também que diferentes linhas representadas por uma linha compartilhada podem ter menus de atalho diferentes. Para recuperar o menu de atalho correto de uma instância de linha compartilhada, use o método e passe o GetContextMenuStrip índice real da linha. Se você acessar a propriedade da ContextMenuStrip linha compartilhada, ela usará o índice de linha compartilhada de -1 e não recuperará o menu de atalho correto.
Evite indexar a DataGridViewRow.Cells coleção. Acessar uma célula diretamente fará com que sua linha pai não seja compartilhada, instanciando um novo DataGridViewRowarquivo . Manipuladores de eventos relacionados à célula recebem objetos de argumento de evento com propriedades de célula que você pode usar para manipular células sem fazer com que as linhas se tornem não compartilhadas. Você também pode usar a propriedade para recuperar os índices de linha e coluna da célula atual sem acessar a CurrentCellAddress célula diretamente.
Evite modos de seleção com base em célula. Esses modos fazem com que as linhas se tornem não compartilhadas. Em vez disso, defina a DataGridView.SelectionMode propriedade como DataGridViewSelectionMode.FullRowSelect ou DataGridViewSelectionMode.FullColumnSelect.
Não manipule os DataGridViewRowCollection.CollectionChanged eventos ou DataGridView.RowStateChanged . Esses eventos fazem com que as linhas se tornem não compartilhadas. Além disso, não chame os DataGridViewRowCollection.OnCollectionChanged métodos ou DataGridView.OnRowStateChanged que geram esses eventos.
Não acesse a DataGridView.SelectedCells coleção quando o valor da DataGridView.SelectionMode propriedade for FullColumnSelect, , ColumnHeaderSelectFullRowSelectou RowHeaderSelect. Isso faz com que todas as linhas selecionadas se tornem não compartilhadas.
Não chame o DataGridView.AreAllCellsSelected método. Esse método pode fazer com que as linhas se tornem não compartilhadas.
Não chame o método quando o DataGridView.SelectAll valor da DataGridView.SelectionMode propriedade for CellSelect. Isso faz com que todas as linhas se tornem não compartilhadas.
Não defina a propriedade ou de uma célula como quando a ReadOnly propriedade correspondente em sua coluna estiver definida como
false
true
.Selected Isso faz com que todas as linhas se tornem não compartilhadas.Não acesse a DataGridViewRowCollection.List propriedade. Isso faz com que todas as linhas se tornem não compartilhadas.
Não chame a
Sort(IComparer)
sobrecarga do Sort método. Classificar com um comparador personalizado faz com que todas as linhas se tornem não compartilhadas.
Confira também
- DataGridView
- Ajuste de desempenho no controle DataGridView do Windows Forms
- Modo virtual no controle DataGridView dos Windows Forms
- Modos de exibição de dados no controle DataGridView dos Windows Forms
- Estilos de Célula no Controle DataGridView dos Windows Forms
- Como definir estilos de célula padrão para o controle DataGridView dos Windows Forms
- Sizing Options in the Windows Forms DataGridView Control (Opções de dimensionamento no controle DataGridView dos Windows Forms)
.NET Desktop feedback
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de