Introduction:
In this article I will show you
that how you can pass the values from the GridView control to other pages. We
will see some of the common scenarios in which you wish to pass the values to
different pages. The article is also supplemented with code so please feel free
to download it.
Using bound columns with
select columns:
Let's first examine the most basic
scenario. In this you are displaying the data in the GridView control using the
BoundColumns and you want to click on the select column and get the value of the
primary key or any other column. Once you have displayed the columns on the GridView control using
the BoundColumns. You can access the select link button using the "SelectedIndexChanged"
event of the GridView control.
Check out the code below:
|
protected
void
GridView1_SelectedIndexChanged(object
sender, EventArgs
e) {
/* In
the line below you can retreive the value of the CategoryID
* But the CategoryID is displayed on the
page which is not a good idea
You can easily set the visible property of
the CategoryID column to false but you
will still be able to access the value of
the CategoryID*/
Response.Write(GridView1.SelectedRow.Cells[0].Text);
} |
As, you have noticed that since I
am using BoundColumns to access the value of the first column using
the Cells property. Although this will work as expected but this is not a very
good solution. The problem with this approach is that when you switch the
columns from one to three or any other way you will be forced to change the code
behind to reflect those changes so that the Cells property will target the
correct column.
Most of the time you don't
want to display the primary key of the table which in this case is CategoryID.
You can make the CategoryID column invisible by using its property visible =
false.
Using template column with
select columns:
This is a much better approach
since now your GridView is no longer dependent on the position of the columns in
the GridView control. Let's see some code that is used to generate the template
columns of the GridView control.
|
<asp:TemplateField
HeaderText="CategoryID"
Visible="False">
<ItemTemplate>
<asp:Label
ID="lblCategoryID"
runat="server"
Text='<%#
Eval("CategoryID") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField
HeaderText="CategoryName">
<ItemTemplate>
<asp:Label
ID="lblCategoryName"
runat="server"
Text='<%#
Eval("CategoryName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField
HeaderText="Description">
<ItemTemplate>
<asp:Label
ID="lblDescription"
runat="server"
Text='<%#
Eval("Description") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField
HeaderText="Link">
<ItemTemplate> |
As, you can see in the code above I
have used ASP.NET Label control to bind the text from the database. And check
out the code below which shows how we can access individual columns.
|
protected
void
GridView1_SelectedIndexChanged(object
sender, EventArgs
e) {
string
selectedText = ((Label)GridView1.SelectedRow.FindControl("lblCategoryID")).Text;
Response.Write(selectedText);
} |
As you can see in the code above the columns are
no longer dependent on the position of the cell index.
Generating links inside GridView control
from id from database:
You might find this the most important. Many
times we have a hyperlink inside the GridView control and we want that hyperlink
to go to certain page based on the id present in the database. I will tell you a
very simple and easy way to accomplish this thingy :).
First make a hyperlink column inside the
GridView control.
|
<asp:TemplateField
HeaderText="Link">
<ItemTemplate>
<asp:HyperLink
ID="hlUrl"
runat="server"
NavigateUrl='<%#
FormatUrl( (int) Eval("CategoryID") ) %>'
Text
=
'<%# Eval("CategoryName")
%>'
/>
</ItemTemplate>
</asp:TemplateField> |
Let's first see the Text property which is binds
the "CategoryName". "NavigateUrl" property calls a method which is named "FormatUrl".
The FormatUrl takes an integer parameter which in this case is "CategoryID".
Let's now look at the FormatUrl method which is defined in the code behind of
the aspx page.
|
// This method is used
to generate a new url
protected string
FormatUrl(int
categoryID)
{
if
(categoryID < 1)
throw
new
ArgumentOutOfRangeException("CategoryID");
return
"CategoryDetails.aspx?categoryID="
+ categoryID;
} |
FormatUrl method is pretty simple to understand.
It take a categoryID which is of type Int32. If the categoryID is less than 1
then there is some error and hence we throw an exception. If however the
categoryID is greater then 0 then we simply concatenates the categoryID with the
string url and return the newly generated url back to the GridView control.
Sending Mulitple Values from GridView to
different page:
I think I have discussed this issue lot of times
in my previous articles. But here it is once again. If you want to select
multiple values from the GridView control and send to a new page you can easily
do this by using checkboxes inside the GridView control which will enable you to
select multiple items. After selecting the items you need to code for the
ASP.NET Button server control which will send the selected values to the new
page.
Let's take a look at the code:
| protected
void
Button1_Click(object
sender, EventArgs
e) {
ArrayList
selectedValues = new
ArrayList();
// This will select multiple items
foreach (GridViewRow
row in
GridView1.Rows)
{
bool result =
((CheckBox)
row.FindControl("CheckBox1")).Checked;
if (result)
{
int
categoryID = Convert.ToInt32(((Label)row.FindControl("lblCategoryID")).Text);
selectedValues.Add(categoryID);
}
}
// Put the selected values in the
Session to be used in a different page
Session["SELECTEDVALUES"]
= selectedValues;
// transfer to a new page
Response.Redirect("NewPage.aspx");
}
|
And here is the code for NewPage.aspx:
| if
(!Page.IsPostBack) {
// Check that if the session object
contains anything or not
if (Session["SELECTEDVALUES"]
!= null)
{
ArrayList
selectedValues = (ArrayList)Session["SELECTEDVALUES"];
// print out the values
foreach (int
intValue in
selectedValues)
Response.Write(intValue);
}
} |
Using HyperLinkColumn to send the values
to a new page:
The last technique I will discuss is that if you want to use the
HyperLinkColumn to pass values to a new page. This is probably the easiest of
them all. Let's take a look how this is done. First thing you need to do is to
add a new HyperLinkColumn.
| <asp:HyperLinkField
DataTextField="CategoryName"
DataNavigateUrlFields="CategoryID"
DataNavigateUrlFormatString="NewPage.aspx?id={0}"
HeaderText="HyperLink
Column" /> |
The DataTextField property is used to display the text on the screen. In this
case I have set it to "CategoryName" which means "CategoryName" will be
displayed as Text inside the GridView control.
"DataNavigateUrlFields" represents what you want to send to the next page
which in this case is "CategoryID".
"DataNavigateUrlFormatString" property represents which page you want to send
the value. In this case it is NewPage.aspx and it will be in the querystring
variable called id.
You can easily receive the values send by the HyperlinkColumn using the
following code:
| if
(Request.QueryString["id"]
!= null) {
int
yourValue = Convert.ToInt32(Request.QueryString["id"]);
}
|
|
As, you can see how easy it is to send as well receive the values. I know you
must be wondering how you can pass multiple values. Well, its pretty simple.
Check out the code below:
| <asp:HyperLinkField
DataTextField="CategoryName"
DataNavigateUrlFields="CategoryID,CategoryName"
DataNavigateUrlFormatString="NewPage.aspx?id={0},CId={1}"HeaderText="HyperLink
Column" /> |
Simply, separate the column names using comma and that's it.
I hope you liked the article, happy coding!