Share via


Modos de classificação da coluna no controle DataGridView do Windows Forms

DataGridView As colunas têm três modos de classificação. O modo de classificação para cada coluna é especificado por meio SortMode da propriedade da coluna, que pode ser definida como um dos seguintes DataGridViewColumnSortMode valores de enumeração.

DataGridViewColumnSortMode valor Descrição
Automatic Padrão para colunas de caixa de texto. A menos que cabeçalhos de coluna sejam usados para seleção, clicar no cabeçalho da coluna classifica automaticamente por essa coluna e exibe um glifo DataGridView indicando a ordem de classificação.
NotSortable Padrão para colunas sem caixa de texto. Você pode classificar essa coluna programaticamente. No entanto, ela não se destina à classificação, então nenhum espaço é reservado para o glifo de classificação.
Programmatic Você pode classificar essa coluna programaticamente e o espaço é reservado para o glifo de classificação.

Talvez você queira alterar o modo de classificação de uma coluna que usa NotSortable como padrão se ela contiver valores que possam ser ordenados de forma significativa. Por exemplo, se tiver uma coluna de banco de dados que contêm números que representam os estados de item, você poderá exibir esses números como ícones correspondentes ao associar uma coluna de imagem para a coluna de banco de dados. Em seguida, você pode alterar os valores de célula numérica em valores de exibição de imagem em um manipulador para o DataGridView.CellFormatting evento. Nesse caso, definir a propriedade como Automatic permitirá que os usuários classifiquem a SortMode coluna. A classificação automática permitirá que os usuários agrupem itens que tenham o mesmo estado, mesmo se os estados correspondentes aos números não tiverem uma sequência natural. As colunas da caixa de seleção são outro exemplo no qual a classificação automática é útil para agrupar itens no mesmo estado.

Você pode classificar um DataGridView programaticamente pelos valores em qualquer coluna ou em várias colunas, independentemente das SortMode configurações. A classificação programática é útil quando você deseja fornecer sua própria interface do usuário para classificação ou quando você deseja implementar a classificação personalizada. Fornecer sua própria interface do usuário de classificação é útil, por exemplo, quando você define o modo de seleção para habilitar a DataGridView seleção de cabeçalho de coluna. Nesse caso, embora os cabeçalhos de coluna não possam ser usados para classificação, você ainda deseja que os cabeçalhos exibam o glifo de classificação apropriado, portanto, defina a SortMode propriedade como Programmatic.

As colunas definidas como modo de classificação programática não exibem um glifo de classificação automaticamente. Para essas colunas, você mesmo deve exibir o glifo definindo a DataGridViewColumnHeaderCell.SortGlyphDirection propriedade. Isso é necessário se você quiser flexibilidade na classificação personalizada. Por exemplo, se você classificar o por várias colunas, convém exibir vários glifos de classificação ou nenhum glifo DataGridView de classificação.

Embora você possa classificar programaticamente um DataGridView por qualquer coluna, algumas colunas, como colunas de botão, podem não conter valores que possam ser ordenados de forma significativa. Para essas colunas, uma SortMode configuração de propriedade indica que ela nunca será usada para classificação, portanto, não há necessidade de reservar espaço no cabeçalho para o glifo de NotSortable classificação.

Quando um DataGridView é classificado, você pode determinar a coluna de classificação e a ordem de classificação verificando os SortedColumn valores das propriedades e SortOrder . Esses valores não são significativos após uma operação de classificação personalizada. Para obter mais informações sobre classificação personalizada, consulte a seção Classificação Personalizada neste tópico.

Quando um DataGridView controle que contém colunas acopladas e não acopladas é classificado, os valores nas colunas não acopladas não podem ser mantidos automaticamente. Para manter esses valores, você deve implementar o modo virtual definindo a propriedade e true manipulando os CellValueNeeded eventos eCellValuePushed.VirtualMode Para obter mais informações, consulte Como implementar o modo virtual no controle DataGridView dos Windows Forms. Não há suporte para a classificação por colunas não associadas no modo associado.

Classificação programática

Você pode classificar um DataGridView programaticamente chamando seu Sort método.

A Sort(DataGridViewColumn,ListSortDirection) sobrecarga do Sort método usa um e um DataGridViewColumn valor de ListSortDirection enumeração como parâmetros. Essa sobrecarga é útil ao classificar por colunas com valores que podem ser ordenados significativamente, mas que você não deseja configurar para a classificação automática. Quando você chama essa sobrecarga e passa em uma coluna com um SortMode valor de propriedade de DataGridViewColumnSortMode.Automatic, as SortedColumn propriedades e são definidas automaticamente e SortOrder o glifo de classificação apropriado aparece no cabeçalho da coluna.

Observação

Quando o DataGridView controle é vinculado a uma fonte de dados externa definindo a propriedade, a DataSource sobrecarga de Sort(DataGridViewColumn,ListSortDirection) método não funciona para colunas não acopladas. Além disso, quando a VirtualMode propriedade é true, você pode chamar essa sobrecarga somente para colunas acopladas. Para determinar se uma coluna está vinculada a dados, verifique o valor da IsDataBound propriedade. Não há suporte para a classificação por colunas não associadas no modo associado.

Classificação personalizada

Você pode personalizar DataGridView usando a Sort(IComparer) sobrecarga do Sort método ou manipulando o SortCompare evento.

A Sort(IComparer) sobrecarga de método usa uma instância de uma classe que implementa a IComparer interface como um parâmetro. Essa sobrecarga é útil quando você deseja fornecer classificação personalizada. Por exemplo, quando os valores em uma coluna não têm uma ordem de classificação natural ou quando a ordem de classificação natural é inadequada. Nesse caso, você não pode usar a classificação automática, mas talvez ainda queira que os usuários classifiquem clicando em cabeçalhos de coluna. Você pode chamar essa sobrecarga em um manipulador para o ColumnHeaderMouseClick evento se você não usar cabeçalhos de coluna para seleção.

Observação

A Sort(IComparer) sobrecarga de método funciona somente quando o controle não está vinculado a uma fonte de dados externa e o DataGridView valor da VirtualMode propriedade é false. Para personalizar a classificação para colunas associadas a uma fonte de dados externa, você deve usar as operações de classificação fornecidas pela fonte de dados. No modo virtual, você deve fornecer suas próprias operações de classificação para colunas não associadas.

Para usar a sobrecarga de método, você deve criar sua própria classe que implementa a Sort(IComparer)IComparer interface. Essa interface requer que sua classe implemente o método, para o IComparer.Compare qual os DataGridView objetos passa DataGridViewRow como entrada quando a sobrecarga do Sort(IComparer) método é chamada. Com isso, você pode calcular a ordem correta da linha com base nos valores em qualquer coluna.

A Sort(IComparer) sobrecarga do método não define as SortedColumn propriedades e SortOrder , portanto, você sempre deve definir a DataGridViewColumnHeaderCell.SortGlyphDirection propriedade para exibir o glifo de classificação.

Como alternativa à sobrecarga de Sort(IComparer) método, você pode fornecer classificação personalizada implementando um manipulador para o SortCompare evento. Esse evento ocorre quando os usuários clicam nos cabeçalhos das colunas configuradas para classificação automática ou quando você chama a Sort(DataGridViewColumn,ListSortDirection) sobrecarga do Sort método. O evento ocorre para cada par de linhas no controle, permitindo que você calcule a ordem correta.

Observação

O SortCompare evento não ocorre quando a DataSource propriedade é definida ou quando o valor da VirtualMode propriedade é true.

Confira também