sobota, 7 listopada 2009

Sortowanie elementów w ListView po kliknięciu na daną kolumnę

Sortowanie danych w ListView po wybranej kolumnie jest banalnie proste. Jak to zrobić w najłatwiejszy sposób? Postaram się pokazać to na prostym przykładzie. Do wykonania tego potrzebujemy nowego projektu WindowsForms Application. Na formę od razu rzucamy ListView.
Moje ListView za zadanie będzie miało przechowywać dane o kilu osobach. Dane te to: Imie, Nazwisko, Wiek. Do tego celu stworzyłem sobie klasę o nazwie Person:
    1     class Person
    2     {
    3         public int Age { get; private set; }
    4         public string FirstName { get; private set; }
    5         public string LastName { get; private set; }
    6
    7         public Person(string firstName, string lastName, int age)
    8         {
    9             this.Age = age;
   10             this.FirstName = firstName;
   11             this.LastName = lastName;
   12         }
   13
   14         public override string ToString()
   15         {
   16             return string.Format("Imie: {0} \nNazwisko: {1} \nWiek: {2}");
   17         }
   18     }
Jak widać nic nadzwyczaj trudnego. Następnie w konstruktorze formy tworzę listę osób, ustawiam właściwości obiektu ListView oraz w pętli dodaję dane do naszego ListView:
    1         public Form1()
    2         {
    3             InitializeComponent();
    4             //tworzymy listę z elementami dla ListView
    5             List<Person> personList = new List<Person>();
    6             personList.Add(new Person("Jacek", "Placek", 20));
    7             personList.Add(new Person("Marek", "Kowalski", 16));
    8             personList.Add(new Person("Mirek", "Marecki", 35));
    9             personList.Add(new Person("Franek", "Pol", 40));
   10             personList.Add(new Person("Sławek", "Kowalski", 18));
   11             personList.Add(new Person("Filip", "Gazownik", 52));
   12
   13             //ustawiamy właściwości naszego ListView
   14             listView1.GridLines = true;
   15             listView1.View = View.Details;
   16             //dodajemy kolumny do ListView
   17             listView1.Columns.Add("Imie");
   18             listView1.Columns.Add("Nazwisko");
   19             listView1.Columns.Add("Wiek");
   20             //Przechodzimy w pętli i dodajemy kolejne rokordy do ListView
   21             foreach (var item in personList)
   22             {
   23                 ListViewItem listViewItem = new ListViewItem(item.FirstName);
   24                 listViewItem.SubItems.Add(item.LastName);
   25                 listViewItem.SubItems.Add(item.Age.ToString());
   26                 listView1.Items.Add(listViewItem);
   27             }
   28         }

Po skompilowaniu i odpaleniu projektu powinniśmy zobaczyć efekt naszej klasy: 3 kolumny i wypełnione wiersze danymi. Jeśli chcemy teraz umożliwić użytkownikowi naszej aplikacji sortowanie danych względem np. kolumny Wiek, musimy dodać odpowiednie instrukcje. ListView posiada właściwość ListViewItemSorter która pozwala na sortowanie. Do właściwości tej możemy przypisać instancję klasy, która implementuje interfejs IComparer:


    1     class Sort : IComparer
    2     {
    3         private int col;
    4
    5         public Sort() : this(0)
    6         {
    7         }
    8
    9         public Sort(int column)
   10         {
   11             this.col = column;
   12         }
   13         #region IComparer Members
   14
   15         public int Compare(object x, object y)
   16         {
   17             string xText = ((ListViewItem)x).SubItems[col].Text;
   18             string yText = ((ListViewItem)y).SubItems[col].Text;
   19             return string.Compare(xText, yText);
   20         }
   21
   22         #endregion
   23     }

Pozostaje jeszcze dodanie odpowiedniego eventa do ListView, aby za każdym razem kiedy klikniemy w którąś kolumnę wywoływana była procedura sortowania:
Dodajemy zdarzenie ColumnClick (np. w konstruktorze formy lub po prostu wybierając odpowiedni event z listy dostępnych dla ListView w IDE):
 
    1 listView1.ColumnClick += new ColumnClickEventHandler(listView1_ColumnClick);

i uzupełnienie metody:

    1         void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
    2         {
    3             listView1.ListViewItemSorter = new Sort(e.Column);
    4         }


Po napisaniu tego i uruchomieniu programu, klikając na kolumnę powinniśmy otrzymać wyniki posortowane rosnąco. Oczywiście wyniki można sortować według różnych kryteriów. Wystarczy stworzyć inne klasy "sortujące" implementujące interfejs IComparer. 

Tyle na dzisiaj i powodzenia przy sortowaniu ;)

Brak komentarzy:

Prześlij komentarz