protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "EditRole")
        {            int index = Convert.ToInt32(e.CommandArgument);
            GridViewRow row = GridView1.Rows[index];            string m_Login = "";
            m_Login = GridView1.DataKeys[row.DataItemIndex].Value.ToString();            ViewState["Login"] = m_Login;
            
            //currencyLib.ShowMessage(this, "",m_Login);
            txtLogin.Text = m_Login;
            BindRoles(m_Login);
            BindData(m_Login);
          
        }
    }这段代码在gridview的第一页是可以运行的,可是点了第二页就会出错.提示索引超出范围。必须为非负值并小于集合大小。
参数名: index 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。
参数名: index源错误: 
行 79: 
行 80:             string m_Login = "";
行 81:             m_Login = GridView1.DataKeys[row.DataItemIndex].Value.ToString();
行 82: 
行 83:             ViewState["Login"] = m_Login;
 源文件: d:\Vs.net 2005\fjepcMis\yhgl\Yhjs.aspx.cs    行: 81 

解决方案 »

  1.   

    m_Login = GridView1.DataKeys[row.DataItemIndex].Value.ToString();
    直接用index不就行吗
      

  2.   

    m_Login = GridView1.DataKeys[row.DataItemIndex].Value.ToString();
    row.DataItemIndex用e.Row.RowIndex替换
      

  3.   

    int index = Convert.ToInt32(e.CommandArgument);
     string m_Login = "";
                m_Login = GridView1.DataKeys[index ].Value.ToString();这样应该就可。