我可以';在网格视图中找不到行';s RowDataBound,给出异常“”;索引超出范围.必须是非负数并且

本文关键字:范围 索引 是非 视图 网格 找不到 我可以 RowDataBound 异常 | 更新日期: 2023-09-27 17:58:35

我正在使用gridview,我想将特定行的颜色更改为网格视图,这就是为什么我必须在rowdatabound事件中找到行。我怎么找到那排?

源代码:

protected void Page_Load(object sender, EventArgs e)
{
    string[] arr={"1","2","3","4"};
    GridView1.DataSource = arr;
    GridView1.DataBind();
}
protected void pagechangin(object sender, GridViewPageEventArgs e) {
    GridView1.PageIndex = e.NewPageIndex;
}
protected void databound(Object sender, GridViewRowEventArgs e) {
    GridViewRow grv=GridView1.Rows[0];
}

我可以';在网格视图中找不到行';s RowDataBound,给出异常“”;索引超出范围.必须是非负数并且

必须注册事件处理程序才能处理事件。但是您还没有向我们展示aspx标记,所以您可能错过了以声明方式添加处理程序:

<asp:gridview id="GridView1" 
    onrowdatabound="GridView1_RowDataBound" 
    runat="server">
  </asp:gridview>
void GridView1_RowDataBound(Object sender, GridViewRowEventArgs e)
{
    if(e.Row.RowType == DataControlRowType.DataRow)
    {
         // e.Row is the GridViewRow
         e.Row.BackColor = System.Drawing.Color.Green;
    }
}

更新IndexOutOfRangeException的原因是您在创建第一行之前正在访问它:

GridViewRow grv=GridView1.Rows[0];

这是一个令人讨厌的问题。对每个GridViewRow调用RowDataBound,不仅对DataItems调用,而且对HeaderFooterPager调用。将要创建的第一个是Header。但是GridView.Rows只返回GridViewRowsRowTypeDataRow。因此,您正试图在创建header行的过程中访问第一个"数据行"。

要修复它,请使用上面的代码并检查RowType

if(e.Row.RowType == DataControlRowType.DataRow)
{
    // now you ca safely access the first row in this way, 
    // altghough i assume that you should use my code above 
    // to set the color of every GridViewRow
    GridViewRow grv=GridView1.Rows[0]; 

除此之外,如果您使用ViewState(默认值),您还应该使用仅网格if(!IsPostBack)DataBind

page_load事件处理程序不正确。Yoou不应该在每次页面加载时都加载数据,而应该只在初始页面加载。也许这造成了问题。

在您的Page_Load方法中尝试此操作

if (!Page.IsPostback)
{
    //copy your code from above
}