Ler em inglês

Compartilhar via


ListViewGroup Classe

Definição

Representa um grupo de itens exibidos em um controle ListView.

C#
[System.ComponentModel.TypeConverter(typeof(System.Windows.Forms.ListViewGroupConverter))]
[System.Serializable]
public sealed class ListViewGroup : System.Runtime.Serialization.ISerializable
Herança
ListViewGroup
Atributos
Implementações

Exemplos

O exemplo de código a seguir demonstra como usar o ListView recurso de agrupamento para organizar itens por valor subitem na exibição de detalhes. Essa forma de agrupamento é semelhante ao agrupamento usado no Windows Explorer. No exemplo, os grupos são criados dinamicamente. Para cada coluna de subitem, um grupo é criado para cada valor de subitem exclusivo. Para a coluna de item pai, um grupo é criado para cada letra inicial exclusiva. Clicar no cabeçalho de uma coluna classifica os itens nos grupos criados para essa coluna. Clicar no mesmo cabeçalho de coluna novamente inverte a ordem dos grupos.

C#
using System;
using System.Collections; 
using System.Windows.Forms;

public class ListViewGroupsExample : Form
{
    private ListView myListView;

    // Determine whether Windows XP or a later
    // operating system is present.
    private bool isRunningXPOrLater = 
        OSFeature.Feature.IsPresent(OSFeature.Themes);

    // Declare a Hashtable array in which to store the groups.
    private Hashtable[] groupTables;

    // Declare a variable to store the current grouping column.
    int groupColumn = 0;

    public ListViewGroupsExample()
    {
        // Initialize myListView.
        myListView = new ListView();
        myListView.Dock = DockStyle.Fill;
        myListView.View = View.Details;
        myListView.Sorting = SortOrder.Ascending;

        // Create and initialize column headers for myListView.
        ColumnHeader columnHeader0 = new ColumnHeader();
        columnHeader0.Text = "Title";
        columnHeader0.Width = -1;
        ColumnHeader columnHeader1 = new ColumnHeader();
        columnHeader1.Text = "Author";
        columnHeader1.Width = -1;
        ColumnHeader columnHeader2 = new ColumnHeader();
        columnHeader2.Text = "Year";
        columnHeader2.Width = -1;

        // Add the column headers to myListView.
        myListView.Columns.AddRange(new ColumnHeader[] 
            {columnHeader0, columnHeader1, columnHeader2});

        // Add a handler for the ColumnClick event.
        myListView.ColumnClick += 
            new ColumnClickEventHandler(myListView_ColumnClick);

        // Create items and add them to myListView.
        ListViewItem item0 = new ListViewItem( new string[] 
            {"Programming Windows", 
            "Petzold, Charles", 
            "1998"} );
        ListViewItem item1 = new ListViewItem( new string[] 
            {"Code: The Hidden Language of Computer Hardware and Software", 
            "Petzold, Charles", 
            "2000"} );
        ListViewItem item2 = new ListViewItem( new string[] 
            {"Programming Windows with C#", 
            "Petzold, Charles", 
            "2001"} );
        ListViewItem item3 = new ListViewItem( new string[] 
            {"Coding Techniques for Microsoft Visual Basic .NET", 
            "Connell, John", 
            "2001"} );
        ListViewItem item4 = new ListViewItem( new string[] 
            {"C# for Java Developers", 
            "Jones, Allen & Freeman, Adam", 
            "2002"} );
        ListViewItem item5 = new ListViewItem( new string[] 
            {"Microsoft .NET XML Web Services Step by Step", 
            "Jones, Allen & Freeman, Adam", 
            "2002"} );
        myListView.Items.AddRange(
            new ListViewItem[] {item0, item1, item2, item3, item4, item5});

        if (isRunningXPOrLater)
        {
            // Create the groupsTable array and populate it with one 
            // hash table for each column.
            groupTables = new Hashtable[myListView.Columns.Count];
            for (int column = 0; column < myListView.Columns.Count; column++)
            {
                // Create a hash table containing all the groups 
                // needed for a single column.
                groupTables[column] = CreateGroupsTable(column);
            }

            // Start with the groups created for the Title column.
            SetGroups(0);
        }

        // Initialize the form.
        this.Controls.Add(myListView);
        this.Size = new System.Drawing.Size(550, 330);
        this.Text = "ListView Groups Example";
    }

    [STAThread]
    static void Main() 
    {
        Application.EnableVisualStyles();
        Application.Run(new ListViewGroupsExample());
    }

    // Groups the items using the groups created for the clicked 
    // column.
    private void myListView_ColumnClick(
        object sender, ColumnClickEventArgs e)
    {
        // Set the sort order to ascending when changing
        // column groups; otherwise, reverse the sort order.
        if ( myListView.Sorting == SortOrder.Descending || 
            ( isRunningXPOrLater && (e.Column != groupColumn) ) )
        {
            myListView.Sorting = SortOrder.Ascending;
        }
        else 
        {
            myListView.Sorting = SortOrder.Descending;
        }
        groupColumn = e.Column;

        // Set the groups to those created for the clicked column.
        if (isRunningXPOrLater)
        {
            SetGroups(e.Column);
        }
    }

    // Sets myListView to the groups created for the specified column.
    private void SetGroups(int column)
    {
        // Remove the current groups.
        myListView.Groups.Clear();

        // Retrieve the hash table corresponding to the column.
        Hashtable groups = (Hashtable)groupTables[column];

        // Copy the groups for the column to an array.
        ListViewGroup[] groupsArray = new ListViewGroup[groups.Count];
        groups.Values.CopyTo(groupsArray, 0);

        // Sort the groups and add them to myListView.
        Array.Sort(groupsArray, new ListViewGroupSorter(myListView.Sorting));
        myListView.Groups.AddRange(groupsArray);

        // Iterate through the items in myListView, assigning each 
        // one to the appropriate group.
        foreach (ListViewItem item in myListView.Items)
        {
            // Retrieve the subitem text corresponding to the column.
            string subItemText = item.SubItems[column].Text;

            // For the Title column, use only the first letter.
            if (column == 0) 
            {
                subItemText = subItemText.Substring(0, 1);
            }

            // Assign the item to the matching group.
            item.Group = (ListViewGroup)groups[subItemText];
        }
    }

    // Creates a Hashtable object with one entry for each unique
    // subitem value (or initial letter for the parent item)
    // in the specified column.
    private Hashtable CreateGroupsTable(int column)
    {
        // Create a Hashtable object.
        Hashtable groups = new Hashtable();

        // Iterate through the items in myListView.
        foreach (ListViewItem item in myListView.Items)
        {
            // Retrieve the text value for the column.
            string subItemText = item.SubItems[column].Text;

            // Use the initial letter instead if it is the first column.
            if (column == 0) 
            {
                subItemText = subItemText.Substring(0, 1);
            }

            // If the groups table does not already contain a group
            // for the subItemText value, add a new group using the 
            // subItemText value for the group header and Hashtable key.
            if (!groups.Contains(subItemText))
            {
                groups.Add( subItemText, new ListViewGroup(subItemText, 
                    HorizontalAlignment.Left) );
            }
        }

        // Return the Hashtable object.
        return groups;
    }

    // Sorts ListViewGroup objects by header value.
    private class ListViewGroupSorter : IComparer
    {
        private SortOrder order;

        // Stores the sort order.
        public ListViewGroupSorter(SortOrder theOrder) 
        { 
            order = theOrder;
        }

        // Compares the groups by header value, using the saved sort
        // order to return the correct value.
        public int Compare(object x, object y)
        {
            int result = String.Compare(
                ((ListViewGroup)x).Header,
                ((ListViewGroup)y).Header
            );
            if (order == SortOrder.Ascending)
            {
                return result;
            }
            else 
            {
                return -result;
            }
        }
    }
}

Comentários

O ListView recurso de agrupamento permite criar grupos visuais de itens logicamente relacionados ListView . Cada grupo consiste em um cabeçalho baseado em texto seguido por uma linha horizontal e os itens atribuídos a esse grupo. Você pode alinhar o texto do cabeçalho à esquerda, à direita ou ao centro do controle. Todos os grupos atribuídos a um ListView controle aparecem sempre que a ListView.View propriedade é definida como um valor diferente de View.List.

ListView os grupos ajudam os usuários a encontrar os itens que estão procurando separando os itens em categorias úteis. Você pode criar as categorias necessárias. Uma maneira típica de agrupar os itens é a maneira como eles são classificados. Por exemplo, você pode agrupar os itens pela letra inicial do nome do item quando eles são classificados em ordem alfabética ou por subitens como tipo ou data quando a lista é classificada clicando em um cabeçalho de coluna na exibição de detalhes. O Windows Explorer usa esse tipo de agrupamento.

Para usar o recurso de agrupamento, adicione um ou mais ListViewGroup objetos à ListView.Groups coleção de um ListView controle . Defina o texto do cabeçalho do grupo e o alinhamento do ListViewGroup cabeçalho no construtor ou defina-os usando as Header propriedades e HeaderAlignment .

Você pode atribuir um item a um grupo especificando o grupo no ListViewItem construtor, definindo a ListViewItem.Group propriedade ou adicionando diretamente o item à Items coleção de um grupo. Todos os itens devem ser atribuídos a grupos antes de serem exibidos. Todos os itens que não são atribuídos a um grupo serão exibidos no grupo padrão, que tem o rótulo de cabeçalho "DefaultGroup{0}". O grupo padrão não está contido na ListView.Groups coleção e não pode ser alterado. É útil principalmente na depuração para garantir que todos os itens tenham sido adicionados corretamente aos grupos.

Um item só pode estar em um grupo por vez. Você pode alterar o grupo ao qual um item pertence definindo a ListViewItem.Group propriedade em tempo de execução ou adicionando-a Items à coleção de outro grupo, o que o remove automaticamente do grupo anterior.

Observação

O recurso de marca de inserção é desabilitado ao usar grupos. Isso ocorre porque o recurso de agrupamento ordena itens por associação de grupo, enquanto o recurso de marca de inserção é usado com reposicionamento de arrastar e soltar em um ListView controle que ainda não ordena seus itens.

Observação

ListView os grupos estão disponíveis somente no Windows XP e na família Windows Server 2003 quando seu aplicativo chama o Application.EnableVisualStyles método . Em sistemas operacionais anteriores, qualquer código relacionado a grupos será ignorado e os grupos não serão exibidos. Como resultado, qualquer código que dependa do recurso de agrupamento pode não funcionar corretamente. Talvez você queira incluir um teste que determine se o recurso de agrupamento está disponível e fornecer funcionalidade alternativa quando ele não estiver disponível. Por exemplo, talvez você queira fornecer classificação alternativa ao executar em sistemas operacionais que não dão suporte à classificação por grupo.

O recurso de marca de inserção é fornecido pela mesma biblioteca que fornece o recurso de temas do sistema operacional. Para marcar para a disponibilidade dessa biblioteca, chame a sobrecarga do FeatureSupport.IsPresent(Object) método e passe o OSFeature.Themes valor.

Construtores

ListViewGroup()

Inicializa uma nova instância da classe ListViewGroup usando o texto de cabeçalho padrão de "ListViewGroup" e alinhamento de cabeçalho à esquerda padrão.

ListViewGroup(String)

Inicializa uma nova instância da classe ListViewGroup usando o valor especificado para inicializar a propriedade Header e usando o alinhamento de cabeçalho à esquerda padrão.

ListViewGroup(String, HorizontalAlignment)

Inicializa uma nova instância da classe ListViewGroup usando o texto de cabeçalho especificado e o alinhamento de cabeçalho especificado.

ListViewGroup(String, String)

Inicializa uma nova instância da classe ListViewGroup usando os valors especificados para inicializar as propriedades Name e Header.

Propriedades

CollapsedState

Controla em qual ListViewGroupCollapsedState o grupo será exibido.

Footer

O texto exibido no rodapé do grupo.

FooterAlignment

O alinhamento do rodapé do grupo.

Header

Obtém ou define o texto de cabeçalho para o grupo.

HeaderAlignment

Obtém ou define o alinhamento do texto do cabeçalho de grupo.

Items

Obtém uma coleção que contém todos os itens associados a esse grupo.

ListView

Obtém o controle ListView que contém este grupo.

Name

Obtém ou define o nome do grupo.

Subtitle

O texto exibido no subtítulo do grupo.

Tag

Obtém ou define o objeto que contém dados sobre o grupo.

TaskLink

O nome do link da tarefa exibido no cabeçalho do grupo.

TitleImageIndex

Obtém ou define o índice da imagem que é exibido para o grupo.

TitleImageKey

Obtém ou define a chave da imagem exibida para o grupo.

Métodos

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
GetHashCode()

Serve como a função de hash padrão.

(Herdado de Object)
GetType()

Obtém o Type da instância atual.

(Herdado de Object)
MemberwiseClone()

Cria uma cópia superficial do Object atual.

(Herdado de Object)
ToString()

Retorna uma cadeia de caracteres que representa o objeto atual.

Implantações explícitas de interface

ISerializable.GetObjectData(SerializationInfo, StreamingContext)

Popula um SerializationInfo com os dados necessários para serializar o objeto de destino.

Aplica-se a

Produto Versões
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
Windows Desktop 3.0, 3.1, 5, 6, 7, 8, 9

Confira também