private void DataGrid1_UpdateCommand_1(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
string connString=ConfigurationSettings.AppSettings["ConnectionString"];
SqlConnection cn=new SqlConnection(connString);
SqlCommand cm=new SqlCommand("updateusers",cn);
cm.CommandType=CommandType.StoredProcedure;
cm.Parameters.Add(new SqlParameter("@Userid",SqlDbType.Char,10));
cm.Parameters.Add(new SqlParameter("@name",SqlDbType.VarChar,10));
cm.Parameters.Add(new SqlParameter("@branch",SqlDbType.Int,10));
cm.Parameters.Add(new SqlParameter("@tel",SqlDbType.VarChar,10));
cm.Parameters.Add(new SqlParameter("@email",SqlDbType.VarChar,10));
String colvalue=e.Item.Cells[1].Controls[0].ToString();
cm.Parameters["@name"].Value=colvalue;
colvalue=e.Item.Cells[2].Controls[0].ToString();
cm.Parameters["@branch"].Value=colvalue;
colvalue=e.Item.Cells[3].Controls[0].ToString();
cm.Parameters["@tel"].Value=colvalue;
colvalue=e.Item.Cells[4].Controls[0].ToString();
cm.Parameters["@email"].Value=colvalue;
cm.Parameters["@Userid"].Value=DataGrid1.DataKeys[(int)e.Item.ItemIndex];//出错地方
cm.Connection.Open();
try
{
cm.ExecuteNonQuery();
Label3.Text="success";
DataGrid1.EditItemIndex=-1;
}
catch(SqlException)
{
Label3.Text="no success";
}
cm.Connection.Close();
BindGrid();

}
System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。参数名: index 请大家指教

解决方案 »

  1.   

    http://www.chinabs.net/webdotnet/default.asp?infoid=89
      

  2.   

    cm.Parameters["@Userid"].Value=DataGrid1.DataKeys[(int)e.Item.ItemIndex];//出错地方
    如果表里没有数据,你想想它能不出错吗?
    给分!
      

  3.   

    兄弟 这是在win2003执行的 xp没有问题
      

  4.   

    DataGrid1.DataKeys[(int)e.Item.ItemIndex];
    //不应该有问题
    //你先看看(int)e.Item.ItemIndex这个是多少
    //在看看此时DataGrid1的count
      

  5.   

    cm.Parameters["@Userid"].Value=DataGrid1.DataKeys[e.Item.ItemIndex].ToString();
      

  6.   

    我记得只有当你在edit事件正确设置了EditItemIndex,才能在update 事件正确使用e.Item.ItemIndex。
      

  7.   

    DataGrid1.DataKeys[Index]是一个对象
    你要取他的值应该用
    DataGrid1.DataKeys[Index].value
    如果是多datakey的情况
    应该用
    DataGrid1.DataKeys[Index].values["DataKeyName"]
    或者
    DataGrid1.DataKeys[Index].values[DataKeyIndex]明白?
      

  8.   

    cm.Parameters.Add(new SqlParameter("@branch",SqlDbType.Int,10));
    改成:
    cm.Parameters.Add(new SqlParameter("@branch",SqlDbType.Int,4));
    再看看其他的和数据库是否吻合
      

  9.   

    private void DataGrid1_EditCommand_1(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    DataGrid1.EditItemIndex=(int)e.Item.ItemIndex;
    BindGrid();

    }
    编辑时候的代码
      

  10.   

    private void DataGrid1_UpdateCommand_1(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    { if(e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem)
    {
    }
    请你加上这个If语句看看呀~因该就可以解决你上面的问题了呀,
      

  11.   

    if(e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem)
    {
    }
      

  12.   

    supertbt(软件_小菜) 
    有道理,lz试一下
      

  13.   

    string connString=ConfigurationSettings.AppSettings["ConnectionString"];
    你这个连接对吗?我感觉写错了
      

  14.   

    starsong(意识决定形态) ( ) 信誉:100    Blog 
    if(e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem)
    {
    }
      

  15.   

    cm.Parameters["@Userid"].Value=DataGrid1.DataKeys[(int)e.Item.ItemIndex];//
    DataKeys是列吧
    i.Item.ItemIndex是行号,把行号放到列里能不报错吗?
    呵呵,你好像说测试有通过的时候,那是因为数据量太少没超过你的列数
      

  16.   

    谢谢大家的回复,我调试成功时用的该代码  cm.Parameters["@Userid"].Value=DataGrid1.Items[e.Item.ItemIndex].Cells[1].ToString();
    上面的我 都试了 ,通不过
      

  17.   

    加入判断:
    if(e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem)
      

  18.   

    你看看你要的数据字段加在datakeys列表中没