I've tried:
uiMasterColourList.SortDescriptors.Add(
new
SortDescriptor(
"Text"
, ListSortDirection.Ascending));
uiMasterColourList.EnableSorting =
true
;
Basically I'm loading a list of colours from the database and then adding them to two different groups in the listview, along with a checkbox to see if the user has already selected the colour. Works great, but the colours end up a little mixed up and it'd be nice to sort them alphabetically inside their groups.
So this seems like a fairly simple problem, but I seem to be missing something that's making it not work.
12 Answers, 1 is accepted
Thank you for writing.
The code you have posted is the correct way to sort the items in ascending order. Also, I have tested it on my end with several manually added items and it works correctly. I am not sure what is causing this issue in your case. Generally, if you are using RadListView in bound mode, you should give the sort descriptor the property name of the bound object according to which you would like to sort. Nevertheless, I would like to kindly ask you to open a new support ticket and send me a sample project which demonstrates your scenario. This will let me investigate it and provide you with further support.
Looking forward to hearing from you.
Kind regards,
Ivan Todorov
the Telerik team
SP1 of Q3’11 of RadControls for WinForms is available for download (see what's new).
Here is a sample of code that illustrates the issue. To use this, create a windows forms application, and add a RadListView control to Form1 called 'uiColourList', and replace the form1.cs with the code below.
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.Linq;
using
System.Text;
using
System.Windows.Forms;
using
Telerik.WinControls.Data;
using
Telerik.WinControls.Enumerations;
using
Telerik.WinControls.UI;
namespace
TelerikListView
{
public
partial
class
Form1 : Form
{
private
List<Colour> colours =
new
List<Colour>();
private
List<Colour> selectedColours =
new
List<Colour>();
public
Form1()
{
InitializeComponent();
setupColourList();
}
private
void
setupColourList()
{
colours.Add(
new
Colour(
"Colour 1"
,
true
,
false
));
colours.Add(
new
Colour(
"Colour 5"
,
true
,
false
));
colours.Add(
new
Colour(
"Colour 2"
,
true
,
false
));
colours.Add(
new
Colour(
"Colour 3"
,
true
,
false
));
colours.Add(
new
Colour(
"Colour 7"
,
true
,
false
));
colours.Add(
new
Colour(
"Colour 6"
,
true
,
false
));
colours.Add(
new
Colour(
"Colour 4"
,
false
,
false
));
colours.Add(
new
Colour(
"Colour 8"
,
false
,
false
));
colours.Add(
new
Colour(
"Colour 9"
,
false
,
false
));
colours.Add(
new
Colour(
"Colour A"
,
false
,
false
));
colours.Add(
new
Colour(
"Colour C"
,
false
,
false
));
colours.Add(
new
Colour(
"Colour D"
,
false
,
true
));
colours.Add(
new
Colour(
"Colour E"
,
false
,
true
));
colours.Add(
new
Colour(
"Colour F"
,
false
,
true
));
colours.Add(
new
Colour(
"Colour B"
,
false
,
true
));
selectedColours.Add(
new
Colour(
"Colour 1"
,
true
,
false
));
selectedColours.Add(
new
Colour(
"Colour F"
,
false
,
true
));
}
private
void
Form1_Load(
object
sender, EventArgs e)
{
uiColourList.Items.Clear();
uiColourList.Groups.Clear();
uiColourList.EnableGrouping =
true
;
uiColourList.EnableSorting =
true
;
uiColourList.ShowCheckBoxes =
true
;
uiColourList.ShowGroups =
true
;
var availableColoursGroup =
new
ListViewDataItemGroup(
"Available Colours"
);
var unavailableColoursGroup =
new
ListViewDataItemGroup(
"Unavailable Colours"
);
var deletedColoursGroup =
new
ListViewDataItemGroup(
"Deleted Colours"
);
availableColoursGroup.Text =
"Available Colours"
;
unavailableColoursGroup.Text =
"Unavailable Colours"
;
deletedColoursGroup.Text =
"Deleted Colours"
;
uiColourList.Groups.Add(availableColoursGroup);
uiColourList.Groups.Add(unavailableColoursGroup);
uiColourList.Groups.Add(deletedColoursGroup);
foreach
(var masterColour
in
colours)
{
var item =
new
ListViewDataItem(masterColour.Name);
item.Tag = masterColour;
if
(selectedColours.Any(m => m.Name == masterColour.Name))
item.CheckState = ToggleState.On;
if
(!masterColour.Available)
item.Group = unavailableColoursGroup;
else
{
item.Group = availableColoursGroup;
}
if
(masterColour.Deleted)
{
item.Group = deletedColoursGroup;
}
uiColourList.Items.Add(item);
}
uiColourList.EnableCustomGrouping =
true
;
uiColourList.SortDescriptors.Add(
new
SortDescriptor(
"Text"
, ListSortDirection.Ascending));
uiColourList.EnableSorting =
true
;
}
}
public
class
Colour
{
public
bool
Deleted {
get
;
set
; }
public
string
Name {
get
;
set
; }
public
bool
Available {
get
;
set
; }
public
Colour(
string
name,
bool
available,
bool
deleted)
{
Name = name;
Available = available;
Deleted = deleted;
}
}
}
Thank you for your assistance.
It appears that there is an issue in RadListView which prevents the items in custom groups from being sorted. I have logged it in PITS and we will address it in a future release. Here you can find the PITS item.
For the time being, I can suggest assigning the groups after the items have been added. This will ensure that the items are added in ascending order to their groups:
private
void
Form1_Load(
object
sender, EventArgs e)
{
uiColourList.Items.Clear();
uiColourList.Groups.Clear();
uiColourList.EnableSorting =
true
;
uiColourList.ShowCheckBoxes =
true
;
uiColourList.EnableCustomGrouping =
true
;
uiColourList.ShowGroups =
true
;
uiColourList.SortDescriptors.Add(
new
SortDescriptor(
"Value"
, ListSortDirection.Ascending));
var availableColoursGroup =
new
ListViewDataItemGroup(
"Available Colours"
);
var unavailableColoursGroup =
new
ListViewDataItemGroup(
"Unavailable Colours"
);
var deletedColoursGroup =
new
ListViewDataItemGroup(
"Deleted Colours"
);
availableColoursGroup.Text =
"Available Colours"
;
unavailableColoursGroup.Text =
"Unavailable Colours"
;
deletedColoursGroup.Text =
"Deleted Colours"
;
uiColourList.Groups.Add(availableColoursGroup);
uiColourList.Groups.Add(unavailableColoursGroup);
uiColourList.Groups.Add(deletedColoursGroup);
foreach
(var masterColour
in
colours)
{
var item =
new
ListViewDataItem(masterColour.Name);
item.Tag = masterColour;
if
(selectedColours.Any(m => m.Name == masterColour.Name))
item.CheckState = ToggleState.On;
uiColourList.Items.Add(item);
}
foreach
(var item
in
uiColourList.Items)
{
Colour masterColour = item.Tag
as
Colour;
if
(!masterColour.Available)
item.Group = unavailableColoursGroup;
else
{
item.Group = availableColoursGroup;
}
if
(masterColour.Deleted)
{
item.Group = deletedColoursGroup;
}
}
}
Your Telerik points have been updated for bringing this issue to our attention.
Please let me know if the workaround does not suit your case or if you have any additional questions.
Regards,
Ivan Todorov
the Telerik team
SP1 of Q3’11 of RadControls for WinForms is available for download (see what's new).
Hi, I'm using the radlistView with custom grouping to group my items. However as notice above, we can't sort the items while grouped. I can't use the work arround mentionned (assigning the group after all the items have been added) because, in my app, items may be added at anytime during the lifetime of the application. Does the issue have been resolved (the PITS item link redirect nowhere) or there's any other work arround?
Thank you,
Here's a short example showing the issue :
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.Linq;
using
System.Text;
using
System.Threading.Tasks;
using
System.Windows.Forms;
using
Telerik.WinControls.Data;
using
Telerik.WinControls.UI;
namespace
RadListViewTestApp
{
public
partial
class
Form1 : Form
{
int
_itemCpt = 100;
ListViewDataItemGroup _lstGroupA =
new
ListViewDataItemGroup(
"Server 1 - 192.168.1.60"
);
ListViewDataItemGroup _lstGroupB =
new
ListViewDataItemGroup(
"Server 2 - 192.168.1.61"
);
ListViewDataItemGroup _lstGroupC =
new
ListViewDataItemGroup(
"Server 3 - 192.168.1.62"
);
public
Form1()
{
InitializeComponent();
radListView1.EnableCustomGrouping =
true
;
this
.radListView1.ShowGroups =
true
;
this
.radListView1.EnableSorting =
true
;
this
.radListView1.SortDescriptors.Add(
new
SortDescriptor(
"Value"
, ListSortDirection.Ascending));
}
private
void
cmdAddItem_Click(
object
sender, EventArgs e)
{
_itemCpt--;
AddRadListViewItem();
}
private
void
AddRadListViewItem()
{
var name =
string
.Format(
"Item {0}"
, _itemCpt);
var item =
new
ListViewDataItem(name);
item.Text = name;
item.Value = name;
item.Group = _itemCpt % 2 != 0 ? _lstGroupA : _itemCpt % 6 == 0 ? _lstGroupC : _lstGroupB;
if
(!radListView1.Groups.Where(group => group.Value == item.Group.Value).Any())
radListView1.Groups.Add(item.Group);
radListView1.Items.Add(item);
}
private
void
cmdToggleGrouping_Click(
object
sender, EventArgs e)
{
radListView1.EnableCustomGrouping = !radListView1.EnableCustomGrouping;
cmdToggleGrouping.Text = radListView1.EnableCustomGrouping ?
"Deactivate grouping"
:
"Activate grouping"
;
}
}
}
Thank you for writing.
The issue is fixed and here is the updated link to the public feedback item: FIX. Sorting in RadListView does not work when using custom grouping.
If I understand correctly you are experiencing an issue with duplicated groups when you add items while your list view has its EnableCustomGrouping property set to false. This is caused by the method responsible for adding the items. In order to achieve the desired behavior, you would need to cache the old groups and assign a group to the newly created items from this collection. Please check below:
public
partial
class
Form1 : Form
{
private
ListViewDataItemGroup[] groupsCache;
int
_itemCpt = 100;
ListViewDataItemGroup _lstGroupA =
new
ListViewDataItemGroup(
"Server 1 - 192.168.1.60"
);
ListViewDataItemGroup _lstGroupB =
new
ListViewDataItemGroup(
"Server 2 - 192.168.1.61"
);
ListViewDataItemGroup _lstGroupC =
new
ListViewDataItemGroup(
"Server 3 - 192.168.1.62"
);
public
Form1()
{
InitializeComponent();
this
.groupsCache =
new
ListViewDataItemGroup[0];
this
.radListView1.EnableCustomGrouping =
true
;
this
.radListView1.ShowGroups =
true
;
this
.radListView1.EnableSorting =
true
;
this
.radListView1.SortDescriptors.Add(
new
SortDescriptor(
"Value"
, ListSortDirection.Descending));
}
private
void
cmdAddItem_Click(
object
sender, EventArgs e)
{
_itemCpt--;
AddRadListViewItem();
}
private
void
AddRadListViewItem()
{
var name =
string
.Format(
"Item {0}"
, _itemCpt);
var item =
new
ListViewDataItem(name);
item.Text = name;
item.Value = name;
item.Group = _itemCpt % 2 != 0 ? _lstGroupA : _itemCpt % 6 == 0 ? _lstGroupC : _lstGroupB;
if
(
this
.radListView1.EnableCustomGrouping && !radListView1.Groups.Where(group => group.Value == item.Group.Value).Any())
{
this
.radListView1.Groups.Add(item.Group);
}
else
if
(!radListView1.EnableCustomGrouping && !
this
.groupsCache.Where(group => group.Value == item.Group.Value).Any())
{
this
.radListView1.Groups.Add(item.Group);
}
radListView1.Items.Add(item);
}
private
void
cmdToggleGrouping_Click(
object
sender, EventArgs e)
{
if
(radListView1.EnableCustomGrouping)
{
this
.groupsCache =
new
ListViewDataItemGroup[
this
.radListView1.Groups.Count];
this
.radListView1.Groups.CopyTo(
this
.groupsCache, 0);
}
radListView1.EnableCustomGrouping = !radListView1.EnableCustomGrouping;
cmdToggleGrouping.Text = radListView1.EnableCustomGrouping ?
"Deactivate grouping"
:
"Activate grouping"
;
}
}
I hope this helps. Should you have further questions please do not hesitate to write back.
Regards,
Hristo Merdjanov
Telerik
Hi Hristo,
Thanks for the link about sorting the radListView with custom grouping. As you said, it seem corrected. However, when I do execute my current code, the items within the group are not sorted. I have added the following lines in constructor to sort the group but didn't work either :
GroupDescriptor groupByValue =
new
GroupDescriptor(
new
SortDescriptor[] {
new
SortDescriptor(
"Value"
, ListSortDirection.Ascending) });
this
.radListView1.GroupDescriptors.Add(groupByValue);
There's a method for sorting items within the group that I should call? I use telerik dlls version 2016.1.112.40
Thank you!
J-F
Thank you for writing.
Could you please try adding the sort descriptor after you have added the first item in RadListView. Please check my code snippet below:
private
void
AddRadListViewItem()
{
var name =
string
.Format(
"Item {0}"
, _itemCpt);
var item =
new
ListViewDataItem(name);
item.Text = name;
item.Value = name;
item.Group = _itemCpt % 2 != 0 ? _lstGroupA : _itemCpt % 6 == 0 ? _lstGroupC : _lstGroupB;
if
(
this
.radListView1.EnableCustomGrouping && !radListView1.Groups.Where(group => group.Value == item.Group.Value).Any())
{
this
.radListView1.Groups.Add(item.Group);
}
else
if
(!radListView1.EnableCustomGrouping && !
this
.groupsCache.Where(group => group.Value == item.Group.Value).Any())
{
this
.radListView1.Groups.Add(item.Group);
}
this
.radListView1.Items.Add(item);
if
(
this
.radListView1.SortDescriptors.Count == 0)
{
this
.radListView1.SortDescriptors.Add(
new
SortDescriptor(
"Value"
, ListSortDirection.Ascending));
}
}
I am also sending you a short video showing the result on my end.
I hope this helps. Should you have further questions please do not hesitate to write back.
Regards,
Hristo Merdjanov
Telerik
Thanks Hristo,
It's now working as expected. As you notice, I must add the sort descriptor when there's at least one element.
Have a nice day and thank you for quick reply,
I am glad that now RadListView is being sorted as expected on your side.
Please let me know if you need further assistance on that matter.
Regards,
Hristo Merdjanov
Telerik
One last question,
I was expecting that the group itself would automatically be ordered. If I change the name of the group in the previous code as follow :
ListViewDataItemGroup _lstGroupA =
new
ListViewDataItemGroup(
"Server 1 - 192.168.1.60"
);
ListViewDataItemGroup _lstGroupB =
new
ListViewDataItemGroup(
"Server 4 - 192.168.1.61"
);
ListViewDataItemGroup _lstGroupC =
new
ListViewDataItemGroup(
"Server 3 - 192.168.1.62"
);
When server 3 is added, the group listing isn't reordered so they appear in the same order they were added (Server 1, Server4 and then Server 3). Is the EnableCustomGrouping = true; disable this feature?
Thanks
Thank you for writing.
I am not sure that I quite well understand your current setup. Could you please open up a support ticket and send us your project.
Should you have further questions please do not hesitate to write back.
Regards,
Hristo Merdjanov
Telerik