2015-10-14 11 views
3

У меня есть задание о ListView сортировать по столбцу, используя C#. Форма Windows и коды, которые я получил от MSDN, не работают. Кто-нибудь может узнать, что не так с кодами? Каждый раз, когда я нажимаю на столбце ListView, ничего не происходит.Listview Sort by Column

Вот код, я также добавил элементы, которые будут показывать в моем ListView

private int sortColumn = -1; 


    private void listView1_ColumnClick(object sender, ColumnClickEventArgs e) 
    { 
     // Determine whether the column is the same as the last column clicked. 
     if (e.Column != sortColumn) 
     { 
      // Set the sort column to the new column. 
      sortColumn = e.Column; 
      // Set the sort order to ascending by default. 
      listView1.Sorting = SortOrder.Ascending; 
     } 
     else 
     { 
      // Determine what the last sort order was and change it. 
      if (listView1.Sorting == SortOrder.Ascending) 
       listView1.Sorting = SortOrder.Descending; 
      else 
       listView1.Sorting = SortOrder.Ascending; 
     } 

     // Call the sort method to manually sort. 
     listView1.Sort(); 
     // Set the ListViewItemSorter property to a new ListViewItemComparer 
     // object. 
     this.listView1.ListViewItemSorter = new ListViewItemComparer(e.Column, 
                  listView1.Sorting); 
    } 

    private void FillItems() 
    { 
     // Add items 
     ListViewItem item1 = new ListViewItem("Nipun Tomar"); 
     item1.SubItems.Add("1"); 
     item1.SubItems.Add("10/11/2000"); 

     ListViewItem item2 = new ListViewItem("First Last"); 
     item2.SubItems.Add("2"); 
     item2.SubItems.Add("12/12/2010"); 


     ListViewItem item3 = new ListViewItem("User User"); 
     item3.SubItems.Add("3"); 
     item3.SubItems.Add("12/01/1800"); 


     ListViewItem item4 = new ListViewItem("Sample"); 
     item4.SubItems.Add("4"); 
     item4.SubItems.Add("05/30/1900"); 


     // Add the items to the ListView. 
     listView1.Items.AddRange(
           new ListViewItem[] {item1, item2, item3, item4}); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     FillItems(); 
    } 


    public class ListViewItemComparer : IComparer 
    { 

     private int col; 
     private SortOrder order; 
     public ListViewItemComparer() 
     { 
      col = 0; 
      order = SortOrder.Ascending; 
     } 
     public ListViewItemComparer(int column, SortOrder order) 
     { 
      col = column; 
      this.order = order; 
     } 
     public int Compare(object x, object y) 
     { 
      int returnVal= -1; 
      returnVal = String.Compare(((ListViewItem)x).SubItems[col].Text, 
          ((ListViewItem)y).SubItems[col].Text); 
      // Determine whether the sort order is descending. 
      if (order == SortOrder.Descending) 
       // Invert the value returned by String.Compare. 
       returnVal *= -1; 
      return returnVal; 
     } 


    } 

Примечание: Я добавил столбцов в виде конструкции.

Вот что мое назначение выглядит следующим образом:

enter image description here

ответ

4

Вы не имеете любые столбцы в вашем списке. Это всего лишь предметы. вот почему событие listView1_ColumnClick никогда не срабатывает. (также убедитесь, что вы добавили это событие в свой список.)

Добавьте это сначала к событию Form1_Load для инициализации столбцов.

// set view mode to see columns 
listView1.View = View.Details; 

// 100 is just a length of column. HorizontalAlignment.Left starts from left side  
listView1.Columns.Add("Name", 100, HorizontalAlignment.Left); 
listView1.Columns.Add("Number", 100, HorizontalAlignment.Left); 
listView1.Columns.Add("Date", 100, HorizontalAlignment.Left); 

Теперь вы видите столбцы, которые вы можете выбрать для сортировки элементов по этой колонке.

Обратите внимание, что я просто добавил 3 колонки. поэтому в представлении списка будет отображаться каждый элемент с двумя их подтипами под столбцами по порядку.

Как вы просили опубликовать gif. Вот это :)

enter image description here

+0

Я отредактировал мой вопрос. Извините, но это не сработало. – Emman

+0

@ Emman вам нужно выбрать столбцы, а не элементы. это событие будет срабатывать только тогда, когда вы, например, нажмете «Имя», то он будет заказывать по имени. нажмите «Дата», затем он будет заказывать по дате. вы хотите, чтобы что-то произошло, когда вы нажимаете на элементы? (отредактируйте: но в изображении я вижу их упорядоченными по 'Int'. Кажется, он работает для вас) –

+0

он не упорядочен по' int', в моем коде 'FillItems' I так и поступал. Также я не понимаю, что вы говорите о столбцах, потому что, как вы видите, есть событие ColumnCLick, которое, когда я нажимаю на столбец, будет сортировать восходящий или нисходящий. Но моя проблема в том, что я не вижу, где у меня ошибка. – Emman

1

Вы называете listView1.Sort() перед установкой компаратора: this.listView1.ListViewItemSorter = ...

Просто инвертировать две строки.

Кроме того, обратите внимание, что вы используете string.Compare для всех столбцов, которые, я думаю, это не то, что вы хотите для колонки 3 (дата)

[Изменить]: Просто понял, теперь установив значение для ListviewItemSorter выведите LV в сортировку: ваш код, похоже, работает даже без звонка listView1.Sort()

Проблема должна быть в другом месте. Попробуйте установить контрольные точки отладчика ...