Hi, I have a grid with custom column comparer class for each column to do custom sorting. Right now, I can do one column sorting, or multiple column sorting by holding shift key and select multiple columns. However, we want to always add the first column for sort. User wants to just click one of the other column to perform two columns sorting without holding the shift key. In other word, we want to add the first column to sorting columns as the first sort no matter which column user clicks.
One possible way to do that, I think, is to disable the column click sorting on column header, catch the header click event, then programatically add the first column and the column user click to sorted column list.
Is there any easy way to do that?
Another Test:
This is NOT giving an error:
...
e.SortedColumns.Clear(); e.SortedColumns.Insert(0, colOverdue, false);
(not the correct result of course - but strange to see that this is working)
Hm. I hoped you would told me, that i'm using the wrong way to get the column :)
OK, more details:
- if i'm using the .add("key-of-column"...) (instead of .insert(column-object) i don't get the error - but not the correct result as the added columns needs to be first column for the sorting
- using the .insert(0, ...) doesn't give an error if the e.SortedColumns List is empty
- But if i click a column header, the event is triggert with the clicked column in the e.SortedColumns. The List contains 1 element. Then, when trying to .insert(0...) i'm getting this error.
The Error:
System.NullReferenceException occurred HResult=-2147467261 Message=Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt. Source=Infragistics4.Win.UltraWinGrid.v16.1 StackTrace: bei Infragistics.Win.UltraWinGrid.SortedColumnsCollection.Insert(Int32 insertIndex, UltraGridColumn column, Boolean groupBy) bei ...ucDokumenteGridView.DfgridDokumente_BeforeSortChange(Object sender, BeforeSortChangeEventArgs e) in ...ucDokumenteGridView.cs:Zeile 1290. InnerException:
Screenshots to show you, that e.SortedColumns looks OK and the colOverdue is filled too:
Again, this is how my function looks right now (i've added a check to avoid adding the column a second time)
private void DfgridDokumente_BeforeSortChange(object sender, BeforeSortChangeEventArgs e) { UltraGridColumn colOverdue = dfgridDokumente.DisplayLayout.Bands[0].Columns["colOverdue"]; if (colOverdue != null) { if (e.SortedColumns.IndexOf("colOverdue") < 0) { e.SortedColumns.Insert(0, colOverdue, false); //e.SortedColumns.Add("colOverdue", true, false); } } }
Hi,
I guess I was not clear.
Do not try to modify grid.DisplayLayout.Bands[0].SortedColumns. Instead, modify e.SortedColumns.
I tried this out and it works fine for me.
I removed the e.Cancel = true, but still gives me the same exception. still can't modify the SortedColumn collection.
Thanks,
Zongwen
Hi Zongwen,
Sorry about that. It looks like the grid will not allow you to directly change the SortedColumns on the band once you are inside that event.
What you can do is... don't cancel the event. Just modify the e.SortedColumns collection so that the column you want is always the first item in the collection.