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 ???
3 Answers, 1 is accepted
0
Accepted
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:
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
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 >>
0
Dan
Top achievements
Rank 1
answered on 13 Mar 2012, 04:08 PM
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.
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.
0
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
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 >>