How to restrict an item from being selected using GridView SelectedIndexChanging Event

When there is a need to restrict a row of a GridView from being selected by the user we use the SelectedIndexChanging event of the GridView control.

When a row's Select button is clicked, the SelectedIndexChanging event is raised. This event is raised before the GridView control handles the select operation.

To restrict a row of a GridView from being selected, we create an event-handling method that cancels the selection operation. The code given below creates and formats a GridView control.



<asp:gridview id="ItemsGridView" datasourceid="MyDataSource" 
autogeneratecolumns="true" autogenerateselectbutton="true" allowpaging="true" 
selectedindex="0" onselectedindexchanged="ItemsGridView_SelectedIndexChanged"
OnSelectedIndexChanging="ItemsGridView_SelectedIndexChanging"   
runat="server">
<selectedrowstyle backcolor="BlanchedAlmond" forecolor="DarkBlue" 
BorderColor="Beige" BorderStyle="Dotted" BorderWidth="3" 
Font-Size="Medium" font-bold="true"/>  
</asp:gridview>
<br/>
<asp:label id="Message"    forecolor="Red"    runat="server"/>
<asp:SqlDataSource ID="MyDataSource"  
ConnectionString="<%$Connectionstrings:ERPConnectionString%>"
SelectCommand="SELECT ItemID,ItemName,ItemType,ClStk FROM ItemTable" 
runat="server"/>

In the code given above, the method 'OnSelectedIndexChanging' of the GridView control is assigned to the event handler ItemsGridView_SelectedIndexChanging.

The following code is the event handler for the SelectedIndexChanging event. The GridViewSelectEventArgs object is passed to the event-handling method and enables us to determine the index of the row selected by the user. To cancel the selection operation, set the Cancel property of the GridViewSelectEventArgs object to 'true'.


void ItemsGridView_SelectedIndexChanging(Object sender, GridViewSelectEventArgs e)
{
	GridViewRow row = ItemsGridView.Rows[e.NewSelectedIndex];
	if (row.Cells[3].Text == "4")
	{	
		e.Cancel = true;
		Message.Text = "You cannot select " + row.Cells[2].Text + ".";
	}
}
To get the currently selected row, use the Rows collection of the GridView and the NewSelectedIndex property of the e argument. We cannot use the SelectedRow property of the GridView control because the SelectedIndexChanging event occurs before the select operation.

If the user selects an item which has the ItemType "4" (4 is chosen for this example), the select operation is cancelled and an error message is displayed. In this example, the second and third columns contain the ItemName and ItemType data respectively. We cancel the select operation by using the Cancel property.