2010-06-07 69 views
0

我使用GridView来显示数据库中的记录。 另外我已经使用TemplateField将超链接附加到GridView。 当我尝试添加“点击”属性,以超链接的RowDateBound事件,我碰到下面的错误里面..ArgumentOutOfRangeException由用户代码未处理 - (ASP .net)

GridView1.DataKeys[e.Row.RowIndex].Value = 'GridView1.DataKeys[e.Row.RowIndex]' threw an exception of type 'System.ArgumentOutOfRangeException' 

消息=“索引超出范围。必须为非负值并小于集合的大小\ r \ n参数名:索引”

这是的RowDataBound mentod内部编码..

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
     { 
      if (e.Row.RowType == DataControlRowType.DataRow) 
      { 
       HyperLink HyperLink1 = (HyperLink)e.Row.FindControl("HyperLink1"); 

//The following line makes the error 
       HyperLink1.Attributes.Add("onclick", "ShowMyModalPopup('" + GridView1.DataKeys[e.Row.RowIndex].Value + "')"); 

      } 
     } 

这是 “ShowMyModalPopup” 功能在JavaScript

<script type="text/javascript"> 
     function ShowMyModalPopup(userpk) 
     { 
     var modal = $find('ModalPopupExtender1'); 
     modal.show(); 
     WebService.FetchOneUser(userpk,DisplayResult); 
     } 
</script> 

虽然索引值为零,但会抛出此异常。为什么这个错误发生 谁能请解释我..

提前很多感谢..

回答

0

我要去猜测,它不工作的原因是因为火灾的RowDataBound在GridView实际获得的前数据。原因是这个特定的事件被用来在最终显示之前操作数据。所以,当你调用这个代码:

GridView1.DataKeys[e.Row.RowIndex].Value 

它没有在网格中任何数据。如果您可以通过其他方式访问该值(例如行中的另一列(您可以访问该行本身)),那么这将是执行此操作的最佳方式。如果不是,则考虑为需要传入的数据添加一列,然后将其隐藏到网格本身。通过这种方式,您可以基于行数据本身形成超链接,而不依赖于它已经在GridView中。

+0

我怎样才能做到这一点.. 能否请您指导我.. 我已经向我的“用户”表“userPK”传递给ShowMyModalPopup() – 2010-06-07 06:56:27

+0

好吧,如果它已经进入GridView控件(通过你指定的任何查询),你所需要做的就是使用代码:'e.Row [“userPK”]。Value'来获取超链接的值。如果它尚未进入GridView进行显示,则需要更新查询(或自动生成的DataTable)以包含该查询。我希望这是有道理的;不知道具体情况很难解释。 – drharris 2010-06-07 12:55:58

相关问题