Retrieve a non-primary DataKey value from a GridView

We have seen how to set the DataKeyNames property of the GridView control with the primary key field of the data table. The DataKeyNames property also allows to set multiple DataKey values.

The example given below demonstrates how to retrieve a non-primary DataKey value from a GridView. In the example, GridView control is used to display records from the accounts table of the ERP database. In the GridView control's declaration, we set the AccountCode as the first key name and AccountName as the second key name and AccountDescription as third key name. Even though, the AccountName and AccountDescription are not the primary key fields, we can assign these non primary key fields to the DataKeyNames property as shown in the code given below.

<asp:GridView ID="GridView1"  DataSourceId="MyAccDataSource" 
  onSelectedIndexChanged="GridView1_SelectedIndexChanged"  runat="server">


We need to configure the SqlDataSource control to retrieve data from the AccountsTable.

<asp:SqlDataSource ID="MyAccDataSource"  
SelectCommand="SELECT AccountsTable.AccountCode,AccountsTable.AccountName, 
AccountsTable.AccountDescription FROM AccountsTable" runat="server"/>

When the user selects a row in the gridView control, the SelectedIndexChanged event is raised. In the SelectedIndexChanged event handler of the gridview we need to write the following code.

protected void GridView1_SelectedIndexChanged(Object src, EventArgs e)
 string Description = GridView1.DataKeys[GridView1.SelectedIndex].

GridView control stores data keys as a collection and this collection is called the DataKeys collection. This DataKeys collection is exposed by the GridView control's DataKeys property. We retrieve the data key associated with a selected row by using the statement:
string id = GridView1.DataKeys[GridView1.SelectedIndex].Value.ToString();
This statement returns the value of the data key associated with the selected row of the gridView control.

Here, we have assigned multiple data keys to DataKeyNames property. So we can use a statement that looks like this:
string Description = GridView1.DataKeys[GridView1.SelectedIndex].Values["AccountDescription"].ToString();

The above statement retrieves the value of the AccountDescription key for the selected row in the GridView control.