I am working on a project right now that requires me to send multiple values to another page from a GridView.  The GridView control in ASP.Net 2.0 makes it easy to send a single value through the URL and it doesn't take very long searching the Internet to find many people who have provided this information.  I might add that it is part of the tooltip for the Gridview if you go through the settings of editing the columns in Visual Studio 2005.  There are also a multitude of suggestions from many people on passing multiple values but after I tried numerous options, I could not get any of them to work.  I did stumble across an article from Azam Sharp that finally got me going in the right direction:  http://www.gridviewguy.com/ArticleDetails.aspx?articleID=133.  While the fundamentals of my application use the foundation of Azam's article, the final product is different enough from the article to make me include it here.

 First we need to create a GridView with the columns that we need.  For better control we will need to use TemplateFields.

 <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
    <Columns>
        <asp:TemplateField HeaderText="Field1">
            <ItemTemplate>
                <asp:HyperLink ID="hlField1" runat="server" NavigateUrl='<%# FormatUrl(Eval("Field1"),Eval("Field2"),Eval("Field3")) %>' Text='<%# Eval("Field1") %>'></asp:HyperLink>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Field2">
            <ItemTemplate>
                <asp:Label ID="lblField2" runat="server" Text='<%# Eval("Field2") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Field3">
            <ItemTemplate>
                <asp:Label ID="lblField3" runat="server" Text='<%# Eval("Field3") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

We also need to bind our data to the GridView.  In this specific case I am using an XML file.

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim oDs As New DataSet
    oDs.ReadXml(Request.PhysicalApplicationPath + "myFile.xml")
    GridView1.DataSource = oDs
    GridView1.DataBind()
End Sub

You will notice in my GridView that I am calling a function, FormatURL. In this specific implementation it is accepting 3 values that it will build into the string that it returns.

Public Function FormatURL(ByVal str1 As String, ByVal str2 As String, ByVal str3 As String) As String
    Return "pagedetail.aspx?id1=" & str1 & "&id2=" & str2 & "&id3=" & str3
End Function

The only thing left to do is to retrieve the querystrings on the new page, pagedetail.aspx in this case.

Dim str1 As String = Request.QueryString("id1")
Dim str2 As String = Request.QueryString("id2")
Dim str3 As String = Request.QueryString("id3")

As you can see, with this basic outline, there is tremendous power in the GridView and what you can do with it using a minimal amount of coding.