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">

 <wijmo:C1BoundField DataField="CategoryID" HeaderText="CategoryID"
 ReadOnly="True" SortExpression="CategoryID">
 <wijmo:C1BoundField DataField="CategoryName" HeaderText="CategoryName"
 <wijmo:C1BoundField DataField="Description" HeaderText="Description"
 <wijmo:C1BoundField DataField="Picture" HeaderText="Picture"
 <wijmo:C1BoundField DataField="UserName" HeaderText="UserName"
 <asp:AccessDataSource ID="AccessDataSource1" runat="server"
 SelectCommand="SELECT * FROM [Categories]">

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
 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
 End Sub

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