stealthsid
Top achievements
Rank 1
stealthsid
asked on 30 Jun 2008, 03:28 PM
I was able to create my own sort order for a radtreeview pretty easily by creating an IComparer class, but I appear to be locked in to Ascending/Descending/None for the GridView.
Is there any way (I'm fine with inheriting objects if necessary) to allow a custom sort order in a GridView? I also don't want to apply that sort order right away, I only want it to occur if the user chooses to sort the column in question.
Is there any way (I'm fine with inheriting objects if necessary) to allow a custom sort order in a GridView? I also don't want to apply that sort order right away, I only want it to occur if the user chooses to sort the column in question.
22 Answers, 1 is accepted
0
Hi Sidney,
Thank you for your question.
Currently RadGridView doesn't support this kind of functionality. Nevertheless, I admit that custom sorting is a good feature and we will consider implementing it in a future release of RadControls.
Do not hesitate to contact me if you have other questions.
Kind regards,
Jack
the Telerik team
Instantly find answers to your questions at the new Telerik Support Center
Thank you for your question.
Currently RadGridView doesn't support this kind of functionality. Nevertheless, I admit that custom sorting is a good feature and we will consider implementing it in a future release of RadControls.
Do not hesitate to contact me if you have other questions.
Kind regards,
Jack
the Telerik team
Instantly find answers to your questions at the new Telerik Support Center
0
Guillaume Crétot Richert
Top achievements
Rank 1
answered on 28 Sep 2009, 07:21 PM
Any ETA on when custom sorting will be supported with RadGridView?
Thanks.
Thanks.
0
Hello Guillaume Crétot Richert,
This functionality is supported in the current edition of RadGridView. You must download and use the last edition of RadControls for Winforms. To enable custom sorting for some column, you must set its CustomDataOperation property and handle RadGridView CustomSorting event.
Do not hesitate to write me back if you have further questions.
Greetings,
Julian Benkov
the Telerik team
Instantly find answers to your questions on the new Telerik Support Portal.
Watch a video on how to optimize your support resource searches and check out more tips on the blogs.
This functionality is supported in the current edition of RadGridView. You must download and use the last edition of RadControls for Winforms. To enable custom sorting for some column, you must set its CustomDataOperation property and handle RadGridView CustomSorting event.
this.radGridView.Columns["City"].CustomDataOperation = CustomDataOperation.Sorting; |
private void radGridView1_CustomSorting(object sender, GridViewCustomSortingEventArgs e) |
{ |
if (e.Column.SortOrder == RadSortOrder.Ascending) |
{ |
e.SortResult = ((IComparable)e.CellValue1).CompareTo(e.CellValue2); |
} |
else |
{ |
e.SortResult = ((IComparable)e.CellValue1).CompareTo(e.CellValue2) * (-1); |
} |
} |
Do not hesitate to write me back if you have further questions.
Greetings,
Julian Benkov
the Telerik team
Instantly find answers to your questions on the new Telerik Support Portal.
Watch a video on how to optimize your support resource searches and check out more tips on the blogs.
0
Guillaume Crétot Richert
Top achievements
Rank 1
answered on 29 Sep 2009, 08:22 PM
Worked like a charm.
Thanks!
Thanks!
0
wima
Top achievements
Rank 1
answered on 15 Dec 2009, 06:24 AM
Hello
This code and also the sample from here http://www.telerik.com/support/kb/winforms/gridview/sorting-by-displaymember-on-combobox-lookup-column.aspx does not work. When I try to sort the column, I get an exception:
System.InvalidOperationException was unhandled
Message="Fehler beim Vergleichen von zwei Elementen im Array."
Source="mscorlib"
StackTrace:
bei System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer)
bei System.Array.Sort[T](T[] array, Int32 index, Int32 length, IComparer`1 comparer)
bei System.Array.Sort[T](T[] array, IComparer`1 comparer)
bei Telerik.WinControls.Data.DataAccessComponent.SortCustom(GridViewDataColumn column)
bei Telerik.WinControls.Data.DataAccessComponent.UpdateIndex()
bei Telerik.WinControls.Data.DataAccessComponent.Telerik.WinControls.Data.ExpressionHelper.IExpressionChangeNotificationConsumer.SortExpressionChanged()
bei Telerik.WinControls.Data.ExpressionHelper.SortExpressionChanged(Object sender, NotifyCollectionChangedEventArgs e)
bei Telerik.WinControls.Data.ExpressionFieldCollection`1.NotifyListenersCollectionChanged(NotifyCollectionChangedEventArgs e)
bei Telerik.WinControls.Data.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
bei Telerik.WinControls.UI.RadSortExpressionCollection.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
bei Telerik.WinControls.Data.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedAction action, Object item, Int32 index)
bei Telerik.WinControls.Data.ObservableCollection`1.InsertItem(Int32 index, T item, Action`1 approvedAction)
bei Telerik.WinControls.Data.ObservableCollection`1.InsertItem(Int32 index, T item)
bei Telerik.WinControls.Data.ItemObservableCollection`1.InsertItem(Int32 index, T item)
bei Telerik.WinControls.UI.RadSortExpressionCollection.InsertSortField(Int32 index, GridSortField sortField)
bei Telerik.WinControls.UI.RadSortExpressionCollection.TryInsertSortField(Int32 index, GridSortField sortField)
bei Telerik.WinControls.UI.RadSortExpressionCollection.InsertItem(Int32 index, GridSortField item)
bei System.Collections.ObjectModel.Collection`1.Add(T item)
bei Telerik.WinControls.UI.GridViewDataColumn.AdvanceSortOrder(Boolean multipleColumnSortingMode)
bei Telerik.WinControls.UI.GridHeaderCellElement.OnMouseUp(MouseEventArgs e)
bei Telerik.WinControls.RadElement.OnCLREventsRise(RoutedEventArgs args)
bei Telerik.WinControls.RadElement.OnBubbleEvent(RadElement sender, RoutedEventArgs args)
bei Telerik.WinControls.RadItem.OnBubbleEvent(RadElement sender, RoutedEventArgs args)
bei Telerik.WinControls.RadElement.RaiseBubbleEvent(RadElement sender, RoutedEventArgs args)
bei Telerik.WinControls.RadItem.RaiseBubbleEvent(RadElement sender, RoutedEventArgs args)
bei Telerik.WinControls.RadElement.RaiseRoutedEvent(RadElement sender, RoutedEventArgs args)
bei Telerik.WinControls.RadElement.DoMouseUp(MouseEventArgs e)
bei Telerik.WinControls.ComponentInputBehavior.OnMouseUp(MouseEventArgs e)
bei Telerik.WinControls.RadControl.OnMouseUp(MouseEventArgs e)
bei Telerik.WinControls.UI.RadGridView.OnMouseUp(MouseEventArgs e)
bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
bei System.Windows.Forms.Control.WndProc(Message& m)
bei System.Windows.Forms.ScrollableControl.WndProc(Message& m)
bei Telerik.WinControls.RadControl.WndProc(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.Run(Form mainForm)
bei ComboBoxSorting.Program.Main() in C:\Users\marco\Desktop\CustomSorting~\ComboBoxSorting\ComboBoxSorting\Program.cs:Zeile 17.
bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()
InnerException: System.ArgumentException
Message="Spalte 'ProductID1' gehört nicht zu Tabelle GridDataTable."
Source="System.Data"
StackTrace:
bei System.Data.DataRow.GetDataColumn(String columnName)
bei System.Data.DataRow.get_Item(String columnName)
bei Telerik.WinControls.UI.GridViewRowInfo.get_Item(String colName)
bei Telerik.WinControls.UI.RowComparer.Compare(GridViewRowInfo x, GridViewRowInfo y)
bei System.Collections.Generic.ArraySortHelper`1.SwapIfGreaterWithItems(T[] keys, IComparer`1 comparer, Int32 a, Int32 b)
bei System.Collections.Generic.ArraySortHelper`1.QuickSort(T[] keys, Int32 left, Int32 right, IComparer`1 comparer)
bei System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer)
InnerException:
In our company we have the version 2009.1.9.316, but its the same with the newest trial dll's.
Can anyone help me? Thank you.
Marco Wittwer
This code and also the sample from here http://www.telerik.com/support/kb/winforms/gridview/sorting-by-displaymember-on-combobox-lookup-column.aspx does not work. When I try to sort the column, I get an exception:
System.InvalidOperationException was unhandled
Message="Fehler beim Vergleichen von zwei Elementen im Array."
Source="mscorlib"
StackTrace:
bei System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer)
bei System.Array.Sort[T](T[] array, Int32 index, Int32 length, IComparer`1 comparer)
bei System.Array.Sort[T](T[] array, IComparer`1 comparer)
bei Telerik.WinControls.Data.DataAccessComponent.SortCustom(GridViewDataColumn column)
bei Telerik.WinControls.Data.DataAccessComponent.UpdateIndex()
bei Telerik.WinControls.Data.DataAccessComponent.Telerik.WinControls.Data.ExpressionHelper.IExpressionChangeNotificationConsumer.SortExpressionChanged()
bei Telerik.WinControls.Data.ExpressionHelper.SortExpressionChanged(Object sender, NotifyCollectionChangedEventArgs e)
bei Telerik.WinControls.Data.ExpressionFieldCollection`1.NotifyListenersCollectionChanged(NotifyCollectionChangedEventArgs e)
bei Telerik.WinControls.Data.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
bei Telerik.WinControls.UI.RadSortExpressionCollection.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
bei Telerik.WinControls.Data.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedAction action, Object item, Int32 index)
bei Telerik.WinControls.Data.ObservableCollection`1.InsertItem(Int32 index, T item, Action`1 approvedAction)
bei Telerik.WinControls.Data.ObservableCollection`1.InsertItem(Int32 index, T item)
bei Telerik.WinControls.Data.ItemObservableCollection`1.InsertItem(Int32 index, T item)
bei Telerik.WinControls.UI.RadSortExpressionCollection.InsertSortField(Int32 index, GridSortField sortField)
bei Telerik.WinControls.UI.RadSortExpressionCollection.TryInsertSortField(Int32 index, GridSortField sortField)
bei Telerik.WinControls.UI.RadSortExpressionCollection.InsertItem(Int32 index, GridSortField item)
bei System.Collections.ObjectModel.Collection`1.Add(T item)
bei Telerik.WinControls.UI.GridViewDataColumn.AdvanceSortOrder(Boolean multipleColumnSortingMode)
bei Telerik.WinControls.UI.GridHeaderCellElement.OnMouseUp(MouseEventArgs e)
bei Telerik.WinControls.RadElement.OnCLREventsRise(RoutedEventArgs args)
bei Telerik.WinControls.RadElement.OnBubbleEvent(RadElement sender, RoutedEventArgs args)
bei Telerik.WinControls.RadItem.OnBubbleEvent(RadElement sender, RoutedEventArgs args)
bei Telerik.WinControls.RadElement.RaiseBubbleEvent(RadElement sender, RoutedEventArgs args)
bei Telerik.WinControls.RadItem.RaiseBubbleEvent(RadElement sender, RoutedEventArgs args)
bei Telerik.WinControls.RadElement.RaiseRoutedEvent(RadElement sender, RoutedEventArgs args)
bei Telerik.WinControls.RadElement.DoMouseUp(MouseEventArgs e)
bei Telerik.WinControls.ComponentInputBehavior.OnMouseUp(MouseEventArgs e)
bei Telerik.WinControls.RadControl.OnMouseUp(MouseEventArgs e)
bei Telerik.WinControls.UI.RadGridView.OnMouseUp(MouseEventArgs e)
bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
bei System.Windows.Forms.Control.WndProc(Message& m)
bei System.Windows.Forms.ScrollableControl.WndProc(Message& m)
bei Telerik.WinControls.RadControl.WndProc(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.Run(Form mainForm)
bei ComboBoxSorting.Program.Main() in C:\Users\marco\Desktop\CustomSorting~\ComboBoxSorting\ComboBoxSorting\Program.cs:Zeile 17.
bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()
InnerException: System.ArgumentException
Message="Spalte 'ProductID1' gehört nicht zu Tabelle GridDataTable."
Source="System.Data"
StackTrace:
bei System.Data.DataRow.GetDataColumn(String columnName)
bei System.Data.DataRow.get_Item(String columnName)
bei Telerik.WinControls.UI.GridViewRowInfo.get_Item(String colName)
bei Telerik.WinControls.UI.RowComparer.Compare(GridViewRowInfo x, GridViewRowInfo y)
bei System.Collections.Generic.ArraySortHelper`1.SwapIfGreaterWithItems(T[] keys, IComparer`1 comparer, Int32 a, Int32 b)
bei System.Collections.Generic.ArraySortHelper`1.QuickSort(T[] keys, Int32 left, Int32 right, IComparer`1 comparer)
bei System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer)
InnerException:
In our company we have the version 2009.1.9.316, but its the same with the newest trial dll's.
Can anyone help me? Thank you.
Marco Wittwer
0
Hi wima,
Thank you for writing. I have not managed to reproduce the described exception. Please, make sure that you are using the latest version of RadControls. If you still experience any difficulties with custom sorting, please open a new support ticket and send us a small sample project demonstrating your scenario. This will help us to investigate the issue further.
Greetings, Martin Vasilev
the Telerik team
Instantly find answers to your questions on the new Telerik Support Portal.
Watch a video on how to optimize your support resource searches and check out more tips on the blogs.
Thank you for writing. I have not managed to reproduce the described exception. Please, make sure that you are using the latest version of RadControls. If you still experience any difficulties with custom sorting, please open a new support ticket and send us a small sample project demonstrating your scenario. This will help us to investigate the issue further.
Greetings, Martin Vasilev
the Telerik team
Instantly find answers to your questions on the new Telerik Support Portal.
Watch a video on how to optimize your support resource searches and check out more tips on the blogs.
0
DGPunkt
Top achievements
Rank 1
answered on 06 Jan 2010, 12:27 PM
Hallo everybody,
as referred in wima´s post from Dec 15, 2009 I tried your example from knowledgebase:
as referred in wima´s post from Dec 15, 2009 I tried your example from knowledgebase:
Custom sorting by DisplayMember on ComboBox/Lookup column
Article relates to RadControls for WinForms Q3 2008 SP2
Created by Martin Vassilev
Last modified Feb. 19, 2008
Last modified by Martin Vassilev
And I got the same InvalidOperationException, wima had. We´re using RadControls for WinForms Q3SP1 2009.
All I wanted to do is sorting a ComboBoxColumn by DisplayValue...
Any suggestions?
Greetings,
Daniel
0
Hello DGPunkt,
Thank you for contacting us.
I managed to reproduce the described exception with the latest release Q3 2009 SP1. It is related to an issue with the columns' unique naming convention. We will address it in one of the next releases. Currently, you can work-around it if you set a different UniqueName for the ProductID column before adding the GridViewComboBoxColumn (regarding the example in the KB Article):
I have updated your Telerik points for reporting this issue. Do not hesitate to contact me again if you have any other questions.
Greetings,
Martin Vasilev
the Telerik team
Instantly find answers to your questions on the new Telerik Support Portal.
Watch a video on how to optimize your support resource searches and check out more tips on the blogs.
Thank you for contacting us.
I managed to reproduce the described exception with the latest release Q3 2009 SP1. It is related to an issue with the columns' unique naming convention. We will address it in one of the next releases. Currently, you can work-around it if you set a different UniqueName for the ProductID column before adding the GridViewComboBoxColumn (regarding the example in the KB Article):
private
void
Form1_Load(
object
sender, EventArgs e)
{
this
.radGridView1.Columns[
"productID"
].UniqueName =
"product"
;
GridViewComboBoxColumn comboCol =
new
GridViewComboBoxColumn();
comboCol.DataSource =
this
.productsBindingSource;
//this.nwindDataSet.Products;
comboCol.ValueMember =
"ProductID"
;
comboCol.DisplayMember =
"ProductName"
;
comboCol.FieldName =
"ProductID"
;
comboCol.HeaderText =
"Product Name"
;
comboCol.Width = 250;
this
.radGridView1.Columns.Insert(2, comboCol);
comboCol.CustomDataOperation = CustomDataOperation.Sorting;
}
I have updated your Telerik points for reporting this issue. Do not hesitate to contact me again if you have any other questions.
Greetings,
Martin Vasilev
the Telerik team
Instantly find answers to your questions on the new Telerik Support Portal.
Watch a video on how to optimize your support resource searches and check out more tips on the blogs.
0
DGPunkt
Top achievements
Rank 1
answered on 21 Jan 2010, 05:09 PM
Hello Martin,
hello telerik-Team,
your solution works for that problem, but there might be another problem:
The same error occurs if the unique name of the combobox column is different than the datasources field name like:
GridViewComboBoxColumn column = new GridViewComboBoxColumn("ColumnName", "DatasourceFieldName");
Greetings,
Daniel
hello telerik-Team,
your solution works for that problem, but there might be another problem:
The same error occurs if the unique name of the combobox column is different than the datasources field name like:
GridViewComboBoxColumn column = new GridViewComboBoxColumn("ColumnName", "DatasourceFieldName");
Greetings,
Daniel
0
Hello Daniel,
Thank you for getting back to me.
You are correct, it throws the same exception and the underlying reason is the same. I have already logged the issue in our issue tracking system. Thank you once again for your participation. Let me know if you have any other questions.
Sincerely yours,
Martin Vasilev
the Telerik team
Instantly find answers to your questions on the new Telerik Support Portal.
Watch a video on how to optimize your support resource searches and check out more tips on the blogs.
Thank you for getting back to me.
You are correct, it throws the same exception and the underlying reason is the same. I have already logged the issue in our issue tracking system. Thank you once again for your participation. Let me know if you have any other questions.
Sincerely yours,
Martin Vasilev
the Telerik team
Instantly find answers to your questions on the new Telerik Support Portal.
Watch a video on how to optimize your support resource searches and check out more tips on the blogs.
0
Mike
Top achievements
Rank 1
answered on 02 Mar 2011, 08:15 PM
It's been over a year now. Has the problem of not being able to sort by the DisplayMember of a ComboBox column been resolved?
0
Hi wima,
Thank you for the questions.
In the latest version sorting by DisplayMember for combo-box column is implemented by default and there is no need to use the custom sorting to include this functionality.
Let me know if you have any additional questions.
Best wishes,
Martin Vasilev
the Telerik team
Thank you for the questions.
In the latest version sorting by DisplayMember for combo-box column is implemented by default and there is no need to use the custom sorting to include this functionality.
Let me know if you have any additional questions.
Best wishes,
Martin Vasilev
the Telerik team
Registration for Q1 2011 What’s New Webinar Week is now open. Mark your calendar for the week starting March 21st and book your seat for a walk through all the exciting stuff we ship with the new release!
0
David Storey
Top achievements
Rank 1
answered on 12 Apr 2011, 12:49 PM
The sort order does not work on "DisplayMember" as expected for a GridViewComboBoxColumn.
If the datasource associated with the column is sorted alphabetically and the id associated with this is also in the same order then the "DisplayMember" sorting works correctly. See attached code. I think this is a bug, as most lists will never be ordered like this.
So a datasource for the GridViewComboBoxColumn would sort correctly if it was like this
list.Add(new ComboItem(3, "D Test"));
Can you confirm this is a bug? Im assuming the best workaround would be to use CustomSorting?
Im using Telerik.WinControls.GridView version 2011.1.11.315
Thanks
Dave
If the datasource associated with the column is sorted alphabetically and the id associated with this is also in the same order then the "DisplayMember" sorting works correctly. See attached code. I think this is a bug, as most lists will never be ordered like this.
So a datasource for the GridViewComboBoxColumn would sort correctly if it was like this
list.Add(new ComboItem(0, "A Test"));
l
ist.Add(new ComboItem(1, "B Test"));
list.Add(new ComboItem(2, "C Test"));list.Add(new ComboItem(3, "D Test"));
but would fail (revert to ValueMember sorting) if it was like this
list.Add(new ComboItem(0, "C Test"));
list.Add(new ComboItem(1, "A Test"));
list.Add(new ComboItem(2, "D Test"));
list.Add(new ComboItem(3, "B Test"));
Can you confirm this is a bug? Im assuming the best workaround would be to use CustomSorting?
Im using Telerik.WinControls.GridView version 2011.1.11.315
Thanks
Dave
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Telerik.WinControls.UI;
namespace GridViewSorting
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
var list = new List<
ComboItem
>();
if (MessageBox.Show("Test Alpha list ordered?", "Order", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
//sorting works on DisplayMember
list.Add(new ComboItem(0, "A Test"));
list.Add(new ComboItem(1, "B Test"));
list.Add(new ComboItem(2, "C Test"));
list.Add(new ComboItem(3, "D Test"));
}
else
{
//sorting works on ValueMember
list.Add(new ComboItem(0, "C Test"));
list.Add(new ComboItem(1, "A Test"));
list.Add(new ComboItem(2, "D Test"));
list.Add(new ComboItem(3, "B Test"));
}
radGridView1.MasterTemplate.Columns.Add("Test1", "TestId", "Test");
radGridView1.MasterTemplate.Columns.Add(new GridViewComboBoxColumn("Test")
{
Width = 150,
HeaderText = "Sort",
FieldName = "Test",
DataSource = list,
DisplayMember = "Description",
ValueMember = "Key",
MinWidth = 100
});
LoadGrid();
}
private void LoadGrid()
{
var data = new List<
DataItem
>();
var rnd = new Random(0);
for (var i = 1; i < 30; i++)
data.Add(new DataItem(rnd.Next(0, 3)));
radGridView1.MasterTemplate.DataSource = data;
}
}
public class DataItem
{
public DataItem(int test)
{
Test = test;
}
public int Test { get; set; }
}
public class ComboItem
{
public ComboItem(int key, string description)
{
Key = key;
Description = description;
}
public int Key { get; set; }
public string Description { get; set; }
}
}
0
Hello David Storey,
Thank you for your sample code.
I confirm that actually we still are sorting by ValueMember as default behaviour in our combo-box column. We will consider to add an API for easy switching to sort based on DisplayMember in one of the next releases. I am adding this as feature request and you can track it here.
In order to implement your requirement with current version, you can use custom sorting. Please consider the following code:
Hope this helps. Let me know if you have any additional questions.
Regards,
Martin Vasilev
the Telerik team
Thank you for your sample code.
I confirm that actually we still are sorting by ValueMember as default behaviour in our combo-box column. We will consider to add an API for easy switching to sort based on DisplayMember in one of the next releases. I am adding this as feature request and you can track it here.
In order to implement your requirement with current version, you can use custom sorting. Please consider the following code:
void
radGridView1_CustomSorting(
object
sender, GridViewCustomSortingEventArgs e)
{
foreach
(var descriptor
in
e.Template.SortDescriptors)
{
if
(descriptor.PropertyName ==
"Test"
)
{
object
value1 = ((GridViewComboBoxColumn)e.Template.Columns[
"Test"
]).GetLookupValue(e.Row1.Cells[
"Test"
].Value);
object
value2 = ((GridViewComboBoxColumn)e.Template.Columns[
"Test"
]).GetLookupValue(e.Row2.Cells[
"Test"
].Value);
e.SortResult = String.Compare(value1.ToString(), value2.ToString());
return
;
}
}
e.Handled =
false
;
}
Hope this helps. Let me know if you have any additional questions.
Regards,
Martin Vasilev
the Telerik team
Do you want to have your say when we set our development plans?
Do you want to know when a feature you care about is added or when a bug fixed?
Explore the
Telerik Public Issue Tracking
system and vote to affect the priority of the items
0
David Storey
Top achievements
Rank 1
answered on 20 Apr 2011, 04:02 PM
Thanks Martin,
Just for completeness I needed to make a small modification
e.SortResult = e.Template.Columns["Test"].SortOrder == RadSortOrder.Descending ? value2.CompareTo(value1) : value1.CompareTo(value2);
Just for completeness I needed to make a small modification
e.SortResult = e.Template.Columns["Test"].SortOrder == RadSortOrder.Descending ? value2.CompareTo(value1) : value1.CompareTo(value2);
0
Theo
Top achievements
Rank 2
answered on 17 Apr 2012, 09:38 AM
Hey there.
Here's a snippet that does it in VB and also a bit more generic.
We use GridViewMultiComboBoxColumn on our grids, but I don't see why you would not be able to cast the column to additional / other column types and handle each type independently.
Note that this only works for single column ordering. I have not been able to get the 'SHIFT+click' to get multiple column sorting working.
Hope this helps.
Theo
Here's a snippet that does it in VB and also a bit more generic.
Private
Sub
dgvMasterDividends_CustomSorting(sender
As
System.
Object
, e
As
Telerik.WinControls.UI.GridViewCustomSortingEventArgs)
Handles
dgvMasterDividends.CustomSorting
For
Each
sd
As
SortDescriptor
In
e.Template.SortDescriptors
If
TypeOf
e.Template.Columns(sd.PropertyName)
Is
GridViewMultiComboBoxColumn
Then
Dim
val1 =
DirectCast
(e.Template.Columns(sd.PropertyName), GridViewMultiComboBoxColumn).GetLookupValue(e.Row1.Cells(sd.PropertyName).Value)
Dim
val2 =
DirectCast
(e.Template.Columns(sd.PropertyName), GridViewMultiComboBoxColumn).GetLookupValue(e.Row2.Cells(sd.PropertyName).Value)
e.SortResult =
If
(e.Template.Columns(sd.PropertyName).SortOrder = RadSortOrder.Descending, val2.CompareTo(val1), val1.CompareTo(val2))
Else
Try
Dim
val1 = e.Row1.Cells(sd.PropertyName).Value
Dim
val2 = e.Row2.Cells(sd.PropertyName).Value
e.SortResult =
If
(e.Template.Columns(sd.PropertyName).SortOrder = RadSortOrder.Descending, val2.CompareTo(val1), val1.CompareTo(val2))
Catch
ex
As
Exception
e.Handled =
False
Return
End
Try
End
If
Next
e.Handled =
True
End
Sub
We use GridViewMultiComboBoxColumn on our grids, but I don't see why you would not be able to cast the column to additional / other column types and handle each type independently.
Note that this only works for single column ordering. I have not been able to get the 'SHIFT+click' to get multiple column sorting working.
Hope this helps.
Theo
0
Hello Theo,
To handle this behavior you must break the loop when the result is not equal to zero. Here is the modified code snippet:
I hope this helps.
Kind regards,
Julian Benkov
the Telerik team
To handle this behavior you must break the loop when the result is not equal to zero. Here is the modified code snippet:
Private
Sub
dgvMasterDividends_CustomSorting(sender
As
System.
Object
, e
As
Telerik.WinControls.UI.GridViewCustomSortingEventArgs)
For
Each
sd
As
SortDescriptor
In
e.Template.SortDescriptors
If
TypeOf
e.Template.Columns(sd.PropertyName)
Is
GridViewMultiComboBoxColumn
Then
Dim
val1
As
dynamic =
DirectCast
(e.Template.Columns(sd.PropertyName), GridViewMultiComboBoxColumn).GetLookupValue(e.Row1.Cells(sd.PropertyName).Value)
Dim
val2
As
dynamic =
DirectCast
(e.Template.Columns(sd.PropertyName), GridViewMultiComboBoxColumn).GetLookupValue(e.Row2.Cells(sd.PropertyName).Value)
e.SortResult =
If
(e.Template.Columns(sd.PropertyName).SortOrder = RadSortOrder.Descending, val2.CompareTo(val1), val1.CompareTo(val2))
Else
Try
Dim
val1
As
dynamic = e.Row1.Cells(sd.PropertyName).Value
Dim
val2
As
dynamic = e.Row2.Cells(sd.PropertyName).Value
e.SortResult =
If
(e.Template.Columns(sd.PropertyName).SortOrder = RadSortOrder.Descending, val2.CompareTo(val1), val1.CompareTo(val2))
If
e.SortResult <> 0
Then
Exit
Try
End
If
Catch
ex
As
Exception
e.Handled =
False
Return
End
Try
End
If
Next
e.Handled =
True
End
Sub
I hope this helps.
Kind regards,
Julian Benkov
the Telerik team
RadControls for WinForms Q1'12 release is now live! Check out what's new or download a free trial >>
0
Theo
Top achievements
Rank 2
answered on 21 Apr 2012, 08:22 AM
Hi there
Should it not be Exit For, why do you exit the try.
If e.SortResult <> 0 means that there was a difference so it needs to be sorted (-1 = smaller, 0 = equal, +1 = bigger) or is this to handle the multi-column sorting (you just refer to handle 'this' behavior in your post so it is a bot confusing.
What does "If e.SortResult <> 0 then Exit Try" actually achieve?
Secondly, in which namespace or reference does the 'dynamic' datatype reside? I cannot define val1 and val2 as dynamic. JustCode says that it wants to generate a stub or new datatype?
Thank you
Theo Jacobs
Should it not be Exit For, why do you exit the try.
If e.SortResult <> 0 means that there was a difference so it needs to be sorted (-1 = smaller, 0 = equal, +1 = bigger) or is this to handle the multi-column sorting (you just refer to handle 'this' behavior in your post so it is a bot confusing.
What does "If e.SortResult <> 0 then Exit Try" actually achieve?
Secondly, in which namespace or reference does the 'dynamic' datatype reside? I cannot define val1 and val2 as dynamic. JustCode says that it wants to generate a stub or new datatype?
Thank you
Theo Jacobs
0
Hello Theo,
Sorry for the introduced inconvenience. I used a code converter to convert my example to VB, thus it produced the wrong code. Here is a example using a native VB project:
In the example the Exit operator is used to stop the next loop when the SortResult is different from 0, in other words when the two rows are different for the values currently compared, the additional compare of values is not needed to the order rows in the collection. When the values are equal, the next SortDescriptor value is processed to determine the order of the rows. The used algorithm is applied when we have more than one SortDescriptor in the SortDescriptors collection. When the user select more columns for sorting using 'SHIFT+click' then multiple columns are added to SortDescriptors collection.
I hope this helps.
Greetings,
Julian Benkov
the Telerik team
Sorry for the introduced inconvenience. I used a code converter to convert my example to VB, thus it produced the wrong code. Here is a example using a native VB project:
Private
Sub
GridViewCustomSorting(sender
As
Object
, e
As
GridViewCustomSortingEventArgs)
For
Each
sd
As
SortDescriptor
In
e.Template.SortDescriptors
If
TypeOf
e.Template.Columns(sd.PropertyName)
Is
GridViewMultiComboBoxColumn
Then
Dim
val1
As
Object
=
DirectCast
(e.Template.Columns(sd.PropertyName), GridViewMultiComboBoxColumn).GetLookupValue(e.Row1.Cells(sd.PropertyName).Value)
Dim
val2
As
Object
=
DirectCast
(e.Template.Columns(sd.PropertyName), GridViewMultiComboBoxColumn).GetLookupValue(e.Row2.Cells(sd.PropertyName).Value)
e.SortResult =
If
(e.Template.Columns(sd.PropertyName).SortOrder = RadSortOrder.Descending, val2.CompareTo(val1), val1.CompareTo(val2))
Else
Try
Dim
val1
As
Object
= e.Row1.Cells(sd.PropertyName).Value
Dim
val2
As
Object
= e.Row2.Cells(sd.PropertyName).Value
e.SortResult =
If
(e.Template.Columns(sd.PropertyName).SortOrder = RadSortOrder.Descending, val2.CompareTo(val1), val1.CompareTo(val2))
If
e.SortResult <> 0
Then
Exit
For
End
If
Catch
ex
As
Exception
e.Handled =
False
Return
End
Try
End
If
Next
e.Handled =
True
End
Sub
In the example the Exit operator is used to stop the next loop when the SortResult is different from 0, in other words when the two rows are different for the values currently compared, the additional compare of values is not needed to the order rows in the collection. When the values are equal, the next SortDescriptor value is processed to determine the order of the rows. The used algorithm is applied when we have more than one SortDescriptor in the SortDescriptors collection. When the user select more columns for sorting using 'SHIFT+click' then multiple columns are added to SortDescriptors collection.
I hope this helps.
Greetings,
Julian Benkov
the Telerik team
RadControls for WinForms Q1'12 release is now live! Check out what's new or download a free trial >>
0
Theo
Top achievements
Rank 2
answered on 23 Apr 2012, 04:20 PM
Hi there
Thank you for the clarification. Thought the exit try looked suspicious.
I understand the reason why for each is used, but a) if you exit for then the loop does not continue for next descriptor, should it not be instead of exit for rather Continue so that next item in loop can be used? and b) I tested the solution (basically it's just the exit for that was added) and I can still not get it working so that multiple columns are sorted in the order that you clicked on the column headers.
If you refer to the attachments.
1. Click Instrument - Clicked on Instruments column, correctly sorted
2. Shift+Click Portfolio - pressed and held shift down, clicked on portfolio, now grid sorted only according to portfolio, Instrument still has sort header image although sorting not on that column occurs anymore
3. Shift+Click Event Type - Same thing happens, now only sorted on EventType, other 2 columns not sorted
Expected behavior is that grid would have been sorted by instrument, then further by portfolio and then further by EventType
Am I missing something?
Thank you
Theo
Thank you for the clarification. Thought the exit try looked suspicious.
I understand the reason why for each is used, but a) if you exit for then the loop does not continue for next descriptor, should it not be instead of exit for rather Continue so that next item in loop can be used? and b) I tested the solution (basically it's just the exit for that was added) and I can still not get it working so that multiple columns are sorted in the order that you clicked on the column headers.
If you refer to the attachments.
1. Click Instrument - Clicked on Instruments column, correctly sorted
2. Shift+Click Portfolio - pressed and held shift down, clicked on portfolio, now grid sorted only according to portfolio, Instrument still has sort header image although sorting not on that column occurs anymore
3. Shift+Click Event Type - Same thing happens, now only sorted on EventType, other 2 columns not sorted
Expected behavior is that grid would have been sorted by instrument, then further by portfolio and then further by EventType
Am I missing something?
Thank you
Theo
0
Hello Theo,
I have reviewed the code snippet again and I found that the loop break does not work for the ComboBox columns, so I extended the code snippet to include this functionality:
When the two rows are not equal for the current sorting criteria, the next comparison to determine the rows position and the SortResult is not needed.
I you continue to experience the issues, please send me part of your data and the setup schema of your RadGridView columns, so I can investigate the issues locally and find best solution for your scenario. In order to be able to attach these, you will need to open a support ticket.
All the best,
Julian Benkov
the Telerik team
I have reviewed the code snippet again and I found that the loop break does not work for the ComboBox columns, so I extended the code snippet to include this functionality:
Private
Sub
GridViewCustomSorting(sender
As
Object
, e
As
GridViewCustomSortingEventArgs)
For
Each
sd
As
SortDescriptor
In
e.Template.SortDescriptors
If
TypeOf
e.Template.Columns(sd.PropertyName)
Is
GridViewMultiComboBoxColumn
Then
Dim
val1
As
Object
=
DirectCast
(e.Template.Columns(sd.PropertyName), GridViewMultiComboBoxColumn).GetLookupValue(e.Row1.Cells(sd.PropertyName).Value)
Dim
val2
As
Object
=
DirectCast
(e.Template.Columns(sd.PropertyName), GridViewMultiComboBoxColumn).GetLookupValue(e.Row2.Cells(sd.PropertyName).Value)
e.SortResult =
If
(e.Template.Columns(sd.PropertyName).SortOrder = RadSortOrder.Descending, val2.CompareTo(val1), val1.CompareTo(val2))
If
e.SortResult <> 0
Then
Exit
For
End
If
Else
Try
Dim
val1
As
Object
= e.Row1.Cells(sd.PropertyName).Value
Dim
val2
As
Object
= e.Row2.Cells(sd.PropertyName).Value
e.SortResult =
If
(e.Template.Columns(sd.PropertyName).SortOrder = RadSortOrder.Descending, val2.CompareTo(val1), val1.CompareTo(val2))
If
e.SortResult <> 0
Then
Exit
For
End
If
Catch
ex
As
Exception
e.Handled =
False
Return
End
Try
End
If
Next
e.Handled =
True
End
Sub
When the two rows are not equal for the current sorting criteria, the next comparison to determine the rows position and the SortResult is not needed.
I you continue to experience the issues, please send me part of your data and the setup schema of your RadGridView columns, so I can investigate the issues locally and find best solution for your scenario. In order to be able to attach these, you will need to open a support ticket.
All the best,
Julian Benkov
the Telerik team
RadControls for WinForms Q1'12 release is now live! Check out what's new or download a free trial >>
0
Theo
Top achievements
Rank 2
answered on 30 Apr 2012, 09:31 AM
Thank you Julian, this seems to have done the job.