protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Del")
        {
            int iIndex = Convert.ToInt32(e.CommandArgument);
            string sUserID = GridView1.DataKeys[iIndex].Value.ToString();
            SqlConnection con = new SqlConnection("server=.;database=Forum;uid=sa");
            SqlCommand cmd = new SqlCommand("delete from tbUser where UserID=@UserID");
            con.Open();
            cmd.Parameters.AddWithValue("@UserID", sUserID);
            Response.Write(string.Format("<script>alert('删除了{0}条记录')</script>", cmd.ExecuteNonQuery()));
            bind();
        }
    }
报错:
索引超出范围。必须为非负值并小于集合大小。
参数名: index 请高手看下

解决方案 »

  1.   

    e.CommandArgument绑定有没有正确。你先看下e.CommandArgument的值是什么样的值。
      

  2.   

    如果单纯int iIndex = Convert.ToInt32(e.CommandArgument); 这就话的话iIndex根据e.CommandArgument正常显示,但是加上  string sUserID = GridView1.DataKeys[iIndex].Value.ToString(); 报错后调试iIndex就为0了,不管e.CommandArgument是几,也不知道怎么回事
      

  3.   

    e.CommandArgument就是所选删除行的索引,这个应该没问题吧
      

  4.   

    假设iIndex的值是2,而DataKeys.Count的值为1.你说会不会报错呢?
      

  5.   

    关键我不知道你想要做什么,不知道给你什么建议。
    e.CommandArgument绑定是ID值么?
      

  6.   

    gridviwe里e.CommandArgument不用自己绑定,本身就绑定了所选行的索引,汗~我想做的当然是根据行索引查出主键,再根据主键删除记录,代码里很明白,再汗~
      

  7.   

    e.CommandArgument,不用自己绑定?第一次听说。
      

  8.   

    你既然绑定的是数据库的主键
    还要string sUserID = GridView1.DataKeys[iIndex].Value.ToString(); 这行代码做啥?
      

  9.   

    你拖一个GridView绑定张表,里面再放一个删除按纽
    不用绑定e.CommandArgument!!!
    事件里
          if (e.CommandName == "Del") 
        {
           int iIndex = Convert.ToInt32(e.CommandArgument);
         Response.write(string.Format("删除的是第{0}行",iIndex+1));
        } 
    你看能不能显示
      

  10.   

    哈哈,我先笑一个
    to:sz_free_bird  太有耐心。
    to:yantaizhifuqishanlu  没有任何人有任何的责任去给你解决问题。
    大家都是帮忙的,因为也是别人帮忙走到这一步的。
    所以不管说话还是问问题的口气,都要客气点。你的自己代码写错,还在埋怨别人。 你已经取到主键,还把主键放到集合中去做索引,脱了裤子放屁取到的已经主键了。。就可以当sUserID  来用了。在给你个建议,你的代码风格不好,.NET是采用Pascal命名规则的,没有必要在第一个字母上说明这个变量的类型。。
      

  11.   

    你不会把CommandArgument改成绑定数据库表中的ID么?
      

  12.   

    to caicai_45
    任何给意见了人我都表示感谢,除了啥都不懂还说别人脱了裤子放屁的,   
             int iIndex = Convert.ToInt32(e.CommandArgument);得的只是行索引,要通过它才能得主建,你回家慢慢笑吧
              
      

  13.   

    哥们,你直接绑主建看能达到效果吗,这个可不是就一个按纽啊,GRIDVIEW是表的形式
      

  14.   

    to:sz_free_bird 走吧,你的经验不需要他来证明,他的贬低也不能降低你一分。独生子女,以自我为中心。。
    当你明白 地球不是为你而转的时候,你才能真正的长大。
      

  15.   

    给你个建议吧:
    <asp:TemplateField>
                    <ItemTemplate>
                        <asp:Button ID="Button1" runat="server" 
                            CommandArgument='<%# Eval("CasestId") %>' CommandName="Del" Text="Button" />
                    </ItemTemplate>
                </asp:TemplateField>
    这样直接绑定表的ID就不用脱了裤子放屁。
    虚心点。
    下次不会再回你的贴。