using System;

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;

namespace SortedListViewDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            #if DEBUG
                MinimizeBox = false;
            #else
                MinimizeBox = true;
            #endif
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.listView1.View = View.Details;

            // Добавляем колонки при помощи класса ColHeader.
            // Четвертый параметр задает порядок сортировки (true - по возрастанию)
            listView1.Columns.Add(new ColHeader("Имя", 110, HorizontalAlignment.Left, false));
            listView1.Columns.Add(new ColHeader("Клуб", 50, HorizontalAlignment.Left, false));
            listView1.Columns.Add(new ColHeader("Цена", 70, HorizontalAlignment.Left, false));

            // Добавляем данные
            listView1.Items.Add(new ListViewItem(new string[] { "Лэмпард, Фрэнк", "Челси", "1100028" }));
            listView1.Items.Add(new ListViewItem(new string[] { "Аршавин, Андрей", "Зенит", "1200054" }));
            listView1.Items.Add(new ListViewItem(new string[] { "Сычев, Дмитрий", "Локомотив", "1053522" }));
            listView1.Items.Add(new ListViewItem(new string[] { "Павлюченко, Роман", "Спартак", "1098750" }));
            listView1.Items.Add(new ListViewItem(new string[] { "Роналду, Криштиану", "Манчестер Юнайтед", "1112212" }));
            listView1.Items.Add(new ListViewItem(new string[] { "Касильяс, Икер", "Реал", "1103011" }));
            
            // Для события ListView.ColumnClick
            this.listView1.ColumnClick += new ColumnClickEventHandler(listView1_ColumnClick);
        }

        private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
        {

            // Создаем экземпляр класса ColHeader
            ColHeader clickedCol = (ColHeader)this.listView1.Columns[e.Column];

            // Устанавливаем порядок сортировки на противоположный
            clickedCol.ascending = !clickedCol.ascending;

            // Получаем число элементов в списке
            int numItems = this.listView1.Items.Count;

            // Замораживаем обновление экрана при новой сортировке данных
            this.listView1.BeginUpdate();

            // Начинаем сортировку
            ArrayList SortArray = new ArrayList();
            for (int i = 0; i < numItems; i++)
            {
                SortArray.Add(new SortWrapper(this.listView1.Items[i], e.Column));
            }

            SortArray.Sort(0, SortArray.Count, new SortWrapper.SortComparer(clickedCol.ascending));

            // Очистим список и заполяем его в новом порядке
            this.listView1.Items.Clear();
            for (int i = 0; i < numItems; i++)
                this.listView1.Items.Add(((SortWrapper)SortArray[i]).sortItem);

            // Выводим данные на экран
            this.listView1.EndUpdate();
        }
    }
}