Let me start by saying that Microsoft does not consider this issue as a problem. As you can see here, this is a “by design” behavior.
The problem is well described in the referred Connect feedback and it contains a workaround.
Although simple, the workaround requires you to always register the GridView Sorting event and make the tweak according to the current GridView
settings. Well, if you are like me, you will forget to do it half the times needed.
So, I made a not so simple workaround that will take care of the issue for me.
I override the OnSorting method from GridView
so I can handle the GridViewEventArgs instance and override its SortDirection value.
To turn this into a general solution, I partially reproduce the ParseSortString
method from DataTable to find out if the current SortExpression contains either the ASC
or DESC
keywords.
Here is the code:
public class GridView : global::System.Web.UI.WebControls.GridView
{
protected override void OnSorting(GridViewSortEventArgs e)
{
if (!string.IsNullOrEmpty(this.SortExpression))
{
if (this.SortExpression.Equals(this.SortExpression))
{
bool isMultipleSortExpression;
SortDirection? sortDirection = GetSortDirection
(this.SortExpression, out isMultipleSortExpression);
if (sortDirection.HasValue)
{
e.SortDirection = SortDirection.Ascending;
}
}
}
base.OnSorting(e);
}
private SortDirection? GetSortDirection
(string sortExpression, out bool isMultipleSortExpression)
{
SortDirection? sortDirection = null;
isMultipleSortExpression = false;
string[] strArray = sortExpression.Split(new char[] { ',' });
for (int i = 0; i < strArray.Length; i++)
{
string strA = strArray[i].Trim();
int length = strA.Length;
if ((length >= 5) && (string.Compare(strA, length - 4,
" ASC", 0, 4, StringComparison.OrdinalIgnoreCase) == 0))
{
sortDirection = SortDirection.Ascending;
}
else if ((length >= 6) && (string.Compare(strA, length - 5,
" DESC", 0, 5, StringComparison.OrdinalIgnoreCase) == 0))
{
sortDirection = SortDirection.Descending;
}
if (!sortDirection.HasValue)
{
break;
}
}
if (sortDirection.HasValue)
{
if (strArray.Length > 1)
{
isMultipleSortExpression = true;
}
}
return sortDirection;
}
}
Enjoy it.