Custom sorting in DetailView?

4 posts, 1 answers
  1. Dan
    Dan avatar
    11 posts
    Member since:
    Feb 2012

    Posted 09 Mar 2012 Link to this post

    I understand you can perform custom sorting using a grid and a tree but how do you do this from within a RadListView?  Basically I have a bound column that contains strings, some are words, some are numbers.  I need to sort them in a "unique" manner.  Can I pass a column a custom sort method or hook a sort event or pass a custom sort descriptor or ???
  2. Answer
    Ivan Todorov
    Admin
    Ivan Todorov avatar
    688 posts

    Posted 13 Mar 2012 Link to this post

    Hi Dan,

    Thank you for contacting us.

    RadListView is built over the same data layer as RadTreeView and RadGridView. Therefore, it is possible to achieve custom sorting by creating a custom comparer. The following code snippet demonstrates this:
    public Form1()
    {
        InitializeComponent();
        this.radListView1.ViewType = ListViewType.DetailsView;
    }
     
    private void radButton1_Click(object sender, EventArgs e)
    {
        this.radListView1.Columns.Add("Number");
        this.radListView1.Columns.Add("Freight");
        Random rand = new Random();
        for (int i = 0; i < 30; i++)
        {
            ListViewDataItem item = new ListViewDataItem();
            this.radListView1.Items.Add(item);
            item[0] = i;
            item[1] = (decimal)(rand.NextDouble() * Int32.MaxValue);
        }
     
        this.radListView1.SortDescriptors.Add(new Telerik.WinControls.Data.SortDescriptor("Number", ListSortDirection.Ascending));
        this.radListView1.ListViewElement.DataView.Comparer = new ListViewCustomComparer(this.radListView1.ListViewElement);
        this.radListView1.EnableSorting = true;
    }
     
     
    public class ListViewCustomComparer : IComparer<ListViewDataItem>
    {
        RadListViewElement listViewElement;
     
        public ListViewCustomComparer(RadListViewElement listViewElement)
        {
            this.listViewElement = listViewElement;
        }
     
        public int Compare(ListViewDataItem x, ListViewDataItem y)
        {
            decimal row1Freight = (decimal)x["Freight"];
            decimal row2Freight = (decimal)y["Freight"];
            if (row1Freight > row2Freight)
            {
                return 1;
            }
            else if (row1Freight < row2Freight)
            {
                return -1;
            }
            else
            {
                return 0;
            }
        }
    }

    Note that the entire sort operation is defined by this comparer. This means that you should take into account the contents of the SortDescriptors collection the RadListView when implementing this custom comparer (that is why I am passing a RadListViewElement as an argument to the constructor of the above comparer).

    I hope you find this useful. Do not hesitate to write back if you have any further questions.

    All the best,
    Ivan Todorov
    the Telerik team
    RadControls for WinForms Q1'12 release is now live! Check out what's new or download a free trial >>
  3. UI for WinForms is Visual Studio 2017 Ready
  4. Dan
    Dan avatar
    11 posts
    Member since:
    Feb 2012

    Posted 13 Mar 2012 Link to this post

    Thank you Ivan for the complete example.  I'm impressed with the responses in the forum thus far.

    I've used comparers before so just getting me to setting the right property was what was needed.

    You indicated:

    "Note that the entire sort operation is defined by this comparer. This means that you should take into account the contents of the SortDescriptors collection the RadListView when implementing this custom comparer (that is why I am passing a RadListViewElement as an argument to the constructor of the above comparer)."

    I understand that the comparer class will be utilized for the entire sort operation.  Are you simply saying that I should also take into account any values (column properties that are set) in the SortDescriptors?  For example, you set your SortDescriptor to be associated with the "Numbers" column yet sorted on "Freight".  If I perform a custom sort, I should take the different columns being set in the SortDescriptors into account and especially in DetailView.  If that is the case, I get it.

    Thanks again.
  5. Ivan Todorov
    Admin
    Ivan Todorov avatar
    688 posts

    Posted 16 Mar 2012 Link to this post

    Hi Dan,

    Yes, you have understood this correctly. Generally, when you have not set a custom comparer, the default comparer of RadDataView does exactly this: reads the contents of the SortDescriptors collection and sorts the items according to the read values.

    When you create a custom comparer that compares for example only the values of the "Freight" column in ascending order, this means that the the values of the SortDescriptors collection won't affect in any manner the sort order. However, at least one SortDescriptor should be available in the SortDescriptors collection because otherwise no sorting is performed at all.

    Should you have any additional questions, I will be glad to answer them.

    Greetings,
    Ivan Todorov
    the Telerik team
    RadControls for WinForms Q1'12 release is now live! Check out what's new or download a free trial >>
Back to Top