views:

5233

answers:

3

I need to sort a DataGridView with Natural Sorting (Like in Explorer) so that numbers and text (in the same column) are sorted naturally, and not alphabetically (so that "place 3" comes before "place 20", etc.). I have a DataGridView, where I have set a DataView as DataSource. The DataView contains a DataTable which is created with some values from a database. The column types are string. I have an IComparer, which does what it should, but I can't figure out how to use it, cause I can't find out how to do the sorting. The DataGridView.SortCompare event, which would be perfect, doesn't work since it is databound. The DataView.Sort, only accept strings with column names and sort orders.

Very annoying. Tried to read related issues here on StackOverflow, and searched google lots and lots, but I can't really find much about this. Only stuff I really find is using that Sort(string) method of the dataview, which wont work, since it sorts alphabetically.

Does anyone know how to do this without too much trouble? It got to be others than me struggeling with this? I really don't want to re-implement the whole datagridview or dataview classes, just to get custom sorting...

Update: In case someone were wondering, I'm still looking for a good answer to this problem. Although in the mean time, I ended up creating my own simple table class, and then feed that into a datagridview manually. Overriding the SortCompare method. Bit annoying, but wasn't too hard, since I only need to show values (no editing or anything) and therefore could convert everything to strings.

A: 

Hi, have you looked at http://www.codinghorror.com/blog/archives/001018.html and http://www.interact-sw.co.uk/iangblog/2007/12/13/natural-sorting.

Thanks

Podge

Those are about the natural sorting itself, which I have figured out already. I have a working IComparer I can use. My problem is how to use it.
Svish
+1  A: 

Take a look at this MSDN page and this blog post. In principle, you need to configure the sorting at the data source (whether its an ObjectDataSource or a SqlDataSource) not at the GridView.

As far as I can tell the DataView class doesn't support anything other than a simple ascending/decending sort. Without seeing the code where you load and bind the data it's hard to make a specific recommendation, but you could either:

  1. Load your data into a List instead of a DataTable, call the Sort method passing in your comparison method and then bind to that list.
  2. Create an ObjectDataSource in your aspx code that gets the data directly from a class, and configure that ObjectDataSource to use your IComparer.
d4nt
Yes, I kind of figured that. But how do you configure sorting of a DataView? The only way of sorting I can see on a DataView is the Sort method, which takes a string with a column and a direction. I can't find a way of specifying an IComparer or anything like that.
Svish
A: 

Hi Svish,

You can create 2 hidden columns. Assign the text part to the 1st hidden column and the number part to the 2nd hidden column. Now sort by these hidden columns (alpha sort for 1st column & numeric sort for the 2nd column).

In this way, you can retain the original column for display purposes & have the 2 hidden columns for sorting.

But that's not going to work so well unless the data is Extremely normalized and predictable...
lc