Sorting a listview by clicking the column header

Has anyone figured out the process to sort a listview (3 column) in Visual COBOL?

  • I am attaching an example that supports sorting of ListView Columns by implementing the IComparer Interface for the Sort method.
    When the column is clicked once it will be sorted in ascending Order. If it is clicked again it will sorted in descending order etc.


    Form1 code:

          class-id testlistsort.Form1 is partial
                    inherits type System.Windows.Forms.Form.
          working-storage section.
          01 lvwColumnSorter type testlistsort.ListViewColumnSorter.
          method-id NEW.
          procedure division.
              invoke self::InitializeComponent
              *> Create an instance of a ListView column sorter and assign it
              *> to the ListView control.
              set lvwColumnSorter to new testlistsort.ListViewColumnSorter
              set listView1::ListViewItemSorter to lvwColumnSorter
              goback.
          end method.
          method-id Form1_Load final private.
          01 row type ListViewItem.
          procedure division using by value sender as object e as type System.EventArgs.
              set row to new ListViewItem("John Smith")
              invoke row::SubItems::Add("ABC Software")
              invoke row::SubItems::Add("800-555-1234")
              invoke listView1::Items::Add(row)
              set row to new ListViewItem("Ann Johnson")
              invoke row::SubItems::Add("Z-Systems Data")
              invoke row::SubItems::Add("111-222-3333")
              invoke listView1::Items::Add(row)
              set row to new ListViewItem("Zachary Jones")
              invoke row::SubItems::Add("New Life Systems")
              invoke row::SubItems::Add("555-987-1111")
              invoke listView1::Items::Add(row)
           *> sets second row in listview to be selected row as indexes are 0 based.
              set listView1::Items[1]::Selected to true
              goback
          end method.
          method-id listView1_ColumnClick final private.
          procedure division using by value sender as object e as type System.Windows.Forms.ColumnClickEventArgs.
           *> Determine if clicked column is already the column that is being sorted.
              if e::Column = lvwColumnSorter::SortColumn
           *> Reverse the current sort direction for this column.
                  if lvwColumnSorter::Order = type SortOrder::Ascending
                      set lvwColumnSorter::Order to type SortOrder::Descending
                  else
                      set lvwColumnSorter::Order to type SortOrder::Ascending
                 end-if
              else
           *> Set the column number that is to be sorted; default to ascending.
                 set lvwColumnSorter::SortColumn to e::Column
                 set lvwColumnSorter::Order to type SortOrder::Ascending
              end-if
           *> Perform the sort with these new sort options.
              invoke listView1::Sort
              goback
          end method.
          method-id button1_Click final private.
          procedure division using by value sender as object e as type System.EventArgs.
              invoke self::Close
          end method.
          end class.

    ListViewColumSorter Class:
         *>
          *> This class is an implementation of the 'IComparer' interface.
          *>
         $set ilusing"System.Collections"
         $set ilusing"System.Windows.Forms"
          class-id testlistsort.ListViewColumnSorter implements type IComparer.
          working-storage section.
          01 ColumnToSort   binary-long.
          01 OrderOfSort type SortOrder.
          01 ObjectCompare type CaseInsensitiveComparer.
          property-id SortColumn binary-long.  
             getter.
                set property-value to ColumnToSort
            setter.
                set ColumnToSort to property-value
          end property.
          property-id Order type SortOrder.  
             getter.
                set property-value to OrderOfSort
            setter.
                set OrderOfSort to property-value
          end property.
          method-id New.
          local-storage section.
          procedure division.
             *> Initialize the column to '0'
                 set ColumnToSort to 0
             *> Initialize the sort order to 'none'
                 set OrderOfSort to type SortOrder::None
             *> Initialize the CaseInsensitiveComparer object
                 set ObjectCompare to new CaseInsensitiveComparer
                 goback.
          end method.
          *> Automatically inserted Methods from System.Collections.IComparer
          *> This method is inherited from the IComparer interface.  It compares the two objects passed using a case insensitive comparison.
          method-id Compare.
          01 compareResult  binary-long.
          01 listViewX     type ListViewItem.
          01 listViewY     type ListViewItem.
          procedure division using by value #x as object #y as object returning return-item as binary-long.
           *> Cast the objects to be compared to ListViewItem objects
                set listViewX to #x as type ListViewItem
                set listviewY to #y as type ListViewItem
           *> Compare the two items
                set compareResult to ObjectCompare::Compare(listviewX::SubItems[ColumnToSort]::Text,
                     listviewY::SubItems[ColumnToSort]::Text)
           *> Calculate correct return value based on object comparison
                if OrderOfSort = type SortOrder::Ascending
           *> Ascending sort is selected, return normal result of compare operation
                   set return-item to compareResult
              else
                   if OrderOfSort = type SortOrder::Descending
           *> Descending sort is selected, return negative result of compare operation
                      compute return-item = compareResult * -1
                   else
           *> Return '0' to indicate they are equal
                       set return-item to 0
                   end-if
              end-if
              goback
          end method.
          end class.

     

    testlistsort.zip