Few days ago, I published an article “How to pass multiple values using GridView HyperLinkField?”, where I explained how you can pass multiple parameters with
Gridview HyperLinkField using D
DataNavigateUrlFormatString properties. In this post, I am going to explain how you can pass some external values as parameters with the same hyperlink field.
DataNavigationUrlField uses only those fields as parameter which are part of
GridView DataSource. Now the problem comes when you want to pass some other variables as parameters which are not part of the
DataSource. As shown in the image below, we are passing EmpID and ParentId as arguments and these two field are the data members of
Now say, You want to pass ChildID for that particular record along with
EmpID and you want that the hyperlink URL should be like “
Default.aspx?EmpID=1&ParentID=P1&ChildID=C1”where ChildID is not part of datasource.
You can achieve this by writing code in code behind for the particular
GridView. There are two events where you can overwrite the navigation URL of that hyperlink field. You can use
Gridview_PreRender for the same.
Let’s start with
RowDataBound event of
GridView is raised when a data row is bound to data. So for each and every row RowDataBound event is raised to bind with actual data from the data source. On the RowDataBound event, you can check for the particular Cell control and can append the
NavigateURL. Below is the code snippet for the same:
</span></span></span></span></span>protected void grdStudent_RowDataBound(object sender, GridViewRowEventArgs e)
if (e.Row.RowType == DataControlRowType.DataRow)
HyperLink hyperlink = (HyperLink)e.Row.Cells.Controls;
hyperlink.NavigateUrl += "&ChildID=" + this.ExternalValue;
And you can do the same thing in
Gridview_PreRender event in a similar way. As per the ASP.NET page life cycle,
Pre_Render for control is raised just before save view state and
Render event. So this is the last event where you can customize your control before saving the
viewstate data and rendering it. Below is the code snippet for the same:
</span></span></span></span></span>protected void grdStudent_PreRender(object sender, EventArgs e)
foreach (GridViewRow row in grdStudent.Rows)
if (row.RowType == DataControlRowType.DataRow)
HyperLink grdviewLink = (HyperLink)row.Cells.Controls;
grdviewLink.NavigateUrl += "&ChildID=" + this.externalValue;
If you want to know how it’s actually working, just set a breakpoint during databound, you will find
NavigateURL for that hyperlink field has already been set with the value that you have passed as
DataNavigationUrlField. And inside RowDataBound or Pre_Render, we are appending the same NavigateURL with an external parameter.
Below is the HTML snippet for the same
You can use
NavigateURL properties for
Hyperlinkfield to set URL, but
NavigateURL will set the same URL for all the rows. So if you want a different URL for each and every row, you have to use
DataNavigationUrlField or you need to override the NavigateURL during RowDataBound or Pre_Render. And if you set both the properties (
DataNavigationUrlField) the DataNavigationUrlField property takes precedence.
I hope this post will help you.
Filed under: ASP.NET
, Tips and Tricks
, Visual Studio