GridView的HyperLinkField的DataNavigateUrlFormatString如何使用自定义的变量,而不是数据库绑定的值

GridView的HyperLinkField的DataNavigateUrlFormatString如何使用自定义的变量,而不是数据库绑定的值.报错:指定的参数已超出有效值的范围。参数名: index

 

当我们在GridView中,偷懒,直接绑定数据库返回的 datatable的时候,用  HyperLinkField  的 DataNavigateUrlFields 来绑定数据库的字段,并且用 DataNavigateUrlFormatString 来显示url链接是很方便的。

如果是要绑定datatable里面的2个字段,则是把 DataNavigateUrlFields 后面的值用逗号分开 DataNavigateUrlFields=“UserId,QQNumber” DataNavigateUrlFormatString='List.aspx?ID={0}&qq={1}'

<asp:GridView ID="GVTeacher" runat="server" >
<Columns>
                <asp:HyperLinkField DataNavigateUrlFields="UserId" DataNavigateUrlFormatString='List.aspx?ID={0}' DataTextField="老师名称" Target="show" HeaderText="老师名称"/>
                <asp:BoundField DataField="回答总数" HeaderText="回答总数" />
            </Columns>
        </asp:GridView>


但是如果我们想在超链接里面,写一个非数据库的字段的值呢?或者是写自己定义的一个变量的值呢?

例如:下面这个超级链接,他的绑定数据库的字段是 “学生名称”,但是这个URL 并没有指定(也就是没有写 DataNavigateUrlFields 和 DataNavigateUrlFormatString)

如果我们的URL既想用到数据库里面的值,又想用到自己的变量,怎么来做?

这个时候需要在 GridView上 加上行事件,onrowdatabound="GVStudent_RowDataBound"

<asp:GridView ID="GVStudent" runat="server" BackColor="White" BorderColor="White" 
            Visible="false" onrowdatabound="GVStudent_RowDataBound">
                       <Columns>
                <asp:HyperLinkField   DataTextField="学生名称" Target="show" HeaderText="学生名称"/>
                <asp:BoundField DataField="提问总数" HeaderText="提问总数" />
            </Columns>
        </asp:GridView>

然后在后台的CS上,加上以下代码

protected void GVStudent_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            //this.GVStudent.EditIndex != e.Row.DataItemIndex 
            //这一句话是为了防止报错  
            //异常详细信息: System.ArgumentOutOfRangeException: 指定的参数已超出有效值的范围。参数名: index
            if (e.Row.RowType == DataControlRowType.DataRow && this.GVStudent.EditIndex != e.Row.DataItemIndex)
            {
                DataRowView DDR = e.Row.DataItem as DataRowView;

                HyperLink temp = e.Row.Cells[0].Controls[0] as HyperLink;
                if (temp!=null)
                {
                    temp.NavigateUrl = string.Format(@"StudentList.aspx?ID={0}&start={1}&end={2}", DDR["UserId"], txtStart.Text, txtEnd.Text);
                }
                
            }
        }
 
原文地址:https://www.cnblogs.com/beeone/p/3449150.html