¿Cómo arreglar las cosas en ListView?

Imagen -> http://img502.imageshack.us/img502/511/87162943.png

¿Cómo clasifico todos los elementos cuando el evento Click se activa en cada columna (pregunta, respuesta, tipo) alfabéticamente?

preguntado el 09 de enero de 11 a las 10:01

¿Es eso incluso un ListBox en esa imagen? -

2 Respuestas

Bueno, podría usar un DataGrid en lugar de un cuadro de lista, lo que simplificaría las cosas, pero de todos modos, también podría implementarlo usted mismo. aquí hay un ejemplo de algo que usé una vez en un ListView:

implementar el evento ColumnClick:

private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
    {
        // Determine if clicked column is already the column that is being sorted.
        if (e.Column == _lvwItemComparer.SortColumn)
        {
            // Reverse the current sort direction for this column.
            if (_lvwItemComparer.Order == SortOrder.Ascending)
            {
                _lvwItemComparer.Order = SortOrder.Descending;
            }
            else
            {
                _lvwItemComparer.Order = SortOrder.Ascending;
            }
        }
        else
        {
            // Set the column number that is to be sorted; default to ascending.
            _lvwItemComparer.SortColumn = e.Column;
            _lvwItemComparer.Order = SortOrder.Ascending;
        }

        // Perform the sort with these new sort options.
        listView1.Sort();
    }

este método usa esta clase para comparar, puede copiarlo y usarlo:

public class ListViewItemComparer : IComparer
{
    // Specifies the column to be sorted
    private int ColumnToSort;

    // Specifies the order in which to sort (i.e. 'Ascending').
    private  SortOrder OrderOfSort;

    // Case insensitive comparer object
    private CaseInsensitiveComparer ObjectCompare;

    // Class constructor, initializes various elements
    public ListViewItemComparer()
    {
        // Initialize the column to '0'
        ColumnToSort = 0;

        // Initialize the sort order to 'none'
        OrderOfSort = SortOrder.None;

        // Initialize the CaseInsensitiveComparer object
        ObjectCompare = new CaseInsensitiveComparer();
    }

    // This method is inherited from the IComparer interface.
    // It compares the two objects passed using a case
    // insensitive comparison.
    //
    // x: First object to be compared
    // y: Second object to be compared
    //
    // The result of the comparison. "0" if equal,
    // negative if 'x' is less than 'y' and
    // positive if 'x' is greater than 'y'
    public int Compare(object x, object y)
    {
        int compareResult;
        ListViewItem listviewX, listviewY;

        // Cast the objects to be compared to ListViewItem objects
        listviewX = (ListViewItem)x;
        listviewY = (ListViewItem)y;


        // Determine whether the type being compared is a date type.
        try
        {
            // Parse the two objects passed as a parameter as a DateTime.
            DateTime firstDate  = DateTime.Parse(listviewX.SubItems[ColumnToSort].Text);
            DateTime secondDate = DateTime.Parse(listviewY.SubItems[ColumnToSort].Text);

            // Compare the two dates.
            compareResult = DateTime.Compare(firstDate, secondDate);
        }

        // If neither compared object has a valid date format,
        // perform a Case Insensitive Sort
        catch
        {
            try
            {
                int num1 = int.Parse(listviewX.SubItems[ColumnToSort].Text);
                int num2 = int.Parse(listviewY.SubItems[ColumnToSort].Text);

                // Compare the two dates.
                compareResult = num1.CompareTo(num2);
            }
            catch
            {
               // Case Insensitive Compare
                compareResult = ObjectCompare.Compare(
                listviewX.SubItems[ColumnToSort].Text,
                listviewY.SubItems[ColumnToSort].Text
                );
            }
        }

        // Calculate correct return value based on object comparison
        if (OrderOfSort == SortOrder.Ascending)
        {
            // Ascending sort is selected, return normal result of compare operation
            return compareResult;
        }
        else if (OrderOfSort == SortOrder.Descending)
        {
            // Descending sort is selected, return negative result of compare operation
            return (-compareResult);
        }
        else
        {
            // Return '0' to indicate they are equal
            return 0;
        }
    }  

    // Gets or sets the number of the column to which to
    // apply the sorting operation (Defaults to '0').
    public int SortColumn
    {
        set
        {
            ColumnToSort = value;
        }
        get
        {
            return ColumnToSort;
        }
    }

    // Gets or sets the order of sorting to apply
    // (for example, 'Ascending' or 'Descending').
    public SortOrder Order
    {
        set
        {
            OrderOfSort = value;
        }
        get
        {
            return OrderOfSort;
        }
    }
} 

Respondido el 09 de enero de 11 a las 22:01

Asignar el ListViewItemSorter propiedad, como se describe en este artículo de KB.

Respondido el 09 de enero de 11 a las 14:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.