Many customers face a situation where they want to retain the row selected by the end user after Sorting/Filtering is applied. Normally, when we apply sorting or filtering after selecting any row then selection is lost after the postback . This blog discuss the approach we need to use for having the selected row even after sorting or filtering.

Step 1: Bind the GridView to a datatable


Firstly, we need to bind the gridview with a data table say Categories table from Northwind database. Since, we are using server side selection, we need to set the AutoGenerateSelectButton property to ‘True’ and thereby, should set the ClientSelectionMode property to ’None’. Else, we will have both server side and client side selection at the same time.

Also, we have to set the AllowSorting and ShowFilter property to ‘True’ in order to enable sorting/filtering on the gridview. Here is the source code of .aspx page:


<wijmo:C1GridView ID="C1GridView1" runat="server" AllowSorting="True" ClientSelectionMode="None"
AutogenerateColumns="False" AutoGenerateSelectButton="True"
DataKeyNames="CategoryID" DataSourceID="AccessDataSource1"
ShowFooter="False" ShowFilter="True">

<Columns>
<wijmo:C1BoundField DataField="CategoryID" HeaderText="CategoryID"
ReadOnly="True" SortExpression="CategoryID">
</wijmo:C1BoundField>
<wijmo:C1BoundField DataField="CategoryName" HeaderText="CategoryName"
SortExpression="CategoryName">
</wijmo:C1BoundField>
<wijmo:C1BoundField DataField="Description" HeaderText="Description"
SortExpression="Description">
</wijmo:C1BoundField>
<wijmo:C1BoundField DataField="Picture" HeaderText="Picture"
SortExpression="Picture">
</wijmo:C1BoundField>
<wijmo:C1BoundField DataField="UserName" HeaderText="UserName"
SortExpression="UserName">
</wijmo:C1BoundField>
</Columns>
</wijmo:C1GridView>
<asp:AccessDataSource ID="AccessDataSource1" runat="server"
DataFile="~/App_Data/C1NWind.mdb"
SelectCommand="SELECT * FROM [Categories]">
</asp:AccessDataSource>


Step 2: Save the Selected row


We need to save the data key value of the selected row in a ViewState object so that we can use it for settting the selection again and hence, we should handle the SelectedIndexChanged event. The code snippet used in this event is as follows:


Protected Sub C1GridView1_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles C1GridView1.SelectedIndexChanged
' Save data key value of selected row
If (Not C1GridView1.SelectedIndex = -1) Then
ViewState("SelectedValue") = C1GridView1.SelectedValue
End If
End Sub

Step 3: Reset the selected index


We should reset the SelectedIndex property of the gridview before re-selecting the row after sorting or filtering. This can be done in the Sorting event and Filtering event with the help of below code:


Protected Sub C1GridView1_Sorting(sender As Object, e As C1.Web.Wijmo.Controls.C1GridView.C1GridViewSortEventArgs) Handles C1GridView1.Sorting
' Reset selected index
C1GridView1.SelectedIndex = -1
End Sub

Protected Sub C1GridView1_Filtering(sender As Object, e As C1.Web.Wijmo.Controls.C1GridView.C1GridViewFilterEventArgs) Handles C1GridView1.Filtering
' Reset selected index
C1GridView1.SelectedIndex = -1
End Sub

Step 4: Re-select the row


Since the gridview is re-binded on postback( which occurs due to sorting or filtering), we need to handle the DataBound event to set the selection again. In this, we should check if the selected row is visible or not and then, re-select it using the ViewState object. Here is the code for same:


Protected Sub C1GridView1_DataBound(sender As Object, e As System.EventArgs) Handles C1GridView1.DataBound
Dim Row As C1GridViewRow
Dim SelectedValue As String = ViewState("SelectedValue")
If SelectedValue Is Nothing Then
Return
End If

' Determine if the selected row is visible and re-select it
For Each Row In C1GridView1.Rows
Dim KeyValue As String = C1GridView1.DataKeys(Row.RowIndex).Value
If (KeyValue = SelectedValue) Then
C1GridView1.SelectedIndex = Row.RowIndex
End If
Next
End Sub


Please refer to the attached sample for complete implementation.
Download Sample