85

I need to resort, in memory, a DataTable based on a column and direction that are coming from a GridView. The function needs to look like this:

public static DataTable resort(DataTable dt, string colName, string direction) { DataTable dtOut = null; .... } 

I need help filling in this function. I think I can use a Select statement but I am not sure how. I can't click on Comments because of this browser but you can show me an in-place or new DataTable solution, either one. For the people showing me pointers, please, I need a coded function similar to the one prototyped.

How about:

// ds.Tables[0].DefaultView.Sort="au_fname DESC"; public static void Resort(ref DataTable dt, string colName, string direction) { string sortExpression = string.Format("{0} {1}", colName, direction); dt.DefaultView.Sort = sortExpression; } 
0

6 Answers 6

122

I assume "direction" is "ASC" or "DESC" and dt contains a column named "colName"

public static DataTable resort(DataTable dt, string colName, string direction) { DataTable dtOut = null; dt.DefaultView.Sort = colName + " " + direction; dtOut = dt.DefaultView.ToTable(); return dtOut; } 

OR without creating dtOut

public static DataTable resort(DataTable dt, string colName, string direction) { dt.DefaultView.Sort = colName + " " + direction; dt = dt.DefaultView.ToTable(); return dt; } 
Sign up to request clarification or add additional context in comments.

3 Comments

This seems to work the first time but not subsequent times. When I set my defaultView.Sort a second time to a different column direction, the table in the gridView diappears....
Hmm, looks like it's overwriting the tableStyles.GridCOlumnStyles
You can also simplify the second code block to simply return dt.DefaultView.ToTable();.
79

If you've only got one DataView, you can sort using that instead:

table.DefaultView.Sort = "columnName asc"; 

Haven't tried it, but I guess you can do this with any number of DataViews, as long as you reference the right one.

Comments

22

Actually got the same problem. For me worked this easy way:

Adding the data to a Datatable and sort it:

dt.DefaultView.Sort = "columnname"; dt = dt.DefaultView.ToTable(); 

1 Comment

How did you have the same problem if you weren't using a DataTable before? The question here is about sorting a DataTable. "Adding the data to a DataTable" can't possibly be of any use in that scenario; it's already in a DataTable. This also appears to repeat the solution from Berkay Turanci from 3 years prior.
7

DataTables have an overloaded Select method that you can you to do this. See here: http://msdn.microsoft.com/en-us/library/way3dy9w.aspx

But the return val of the Select call is not a DataTable but an array of RowData objects. If you want to return a DataTable from your function you will have to build it from scratch based on that data array. Here is a post that addresses and provides a sample for both issues: http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/157a4a0f-1324-4301-9725-3def95de2bf2/

Comments

6

In case you want to sort in more than one direction

 public static void sortOutputTable(ref DataTable output) { DataView dv = output.DefaultView; dv.Sort = "specialCode ASC, otherCode DESC"; DataTable sortedDT = dv.ToTable(); output = sortedDT; } 

Comments

4

Create a DataView. You cannot sort a DataTable directly, but you can create a DataView from the DataTable and sort that.

Creating: http://msdn.microsoft.com/en-us/library/hy5b8exc.aspx

Sorting: http://msdn.microsoft.com/en-us/library/13wb36xf.aspx

The following code example creates a view that shows all the products where the number of units in stock is less than or equal to the reorder level, sorted first by supplier ID and then by product name.

DataView prodView = new DataView(prodDS.Tables["Products"], "UnitsInStock <= ReorderLevel", "SupplierID, ProductName", DataViewRowState.CurrentRows); 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.