本帖最后由 u010691794 于 2013-07-30 10:20:26 编辑

解决方案 »

  1.   

    你的DataKeyNames主键设置了几个?
      

  2.   

    用C#编辑,这样贴出来看不清。
    this.gvUsers.DataKeys[i][2],2超出范围了。
      

  3.   


      protected void gvUsers_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            // gvUsers.DataKeyNames = new string[] { "UserId", "UserName", "Sex", "Birthday" };
           ClassLibrary1.User u=new ClassLibrary1.User();        int i=e.RowIndex;        for (i = 0; i < gvUsers.Rows.Count; i++)
            {            u.UserId = this.gvUsers.DataKeys[i][2].ToString().Trim();
                u.UserName = gvUsers.DataKeys[i][3].ToString().Trim();
                u.Sex = gvUsers.DataKeys[i][4].ToString().Trim();            DateTime enter;
                try
                {
                    enter = Convert.ToDateTime(gvUsers.DataKeys[i][5].ToString().Trim());
                    u.Birthday = enter;
                }
                catch (FormatException ex)
                {
                    System.Windows.Forms.MessageBox.Show("日期不正确。");
                }
            }       
            ClassLibrary1.teacherctrl.Update(u);
             gvUsers.EditIndex = -1;
         
             gvUsers.DataBind();
              }GridView定义:
    <asp:GridView ID="gvUsers" runat="server" 
                onrowdeleting="gvUsers_RowDeleting" DataKeyNames="UserId" 
                AllowPaging="True" PageSize="5" 
                OnPageIndexChanging="gvwDesignationName_PageIndexChanging" 
                onrowcancelingedit="gvUsers_RowCancelingEdit" 
                onrowediting="gvUsers_RowEditing" onrowupdating="gvUsers_RowUpdating" >Update方法;
     public static void Update(User u)
            {
                SqlConnection conn =
                    new SqlConnection("Data source=192.168.212.153;initial catalog=Internships2013;user id=Login2013;password=Login2013;");            string sqlStr = "Update teacherInfozhoushengbo set UserId='" + u.UserId + "', UserName='" + u.UserName + "', Sex='" + u.Sex + "', Birthday='" + u.Birthday + "' where UserId='"+u.UserId+"'";
                SqlCommand cmd = new SqlCommand(sqlStr, conn);
                conn.Open();
                var res = cmd.ExecuteNonQuery();
                conn.Close();
            }User类:
    public class User
        {
            public string UserId { get; set; }
            public string UserName { get; set; }
            public string Sex { get; set; }
            public DateTime Birthday { get; set; }
        }
      

  4.   

    主键不是只能有一个吗
    Names是复数,表示可以有多个,数据库中也可以有多个主键
    如果你只设置了一个,this.gvUsers.DataKeys[i][2]自然报错了,表示访问第i行的第3个主键
    你用for遍历行也是错误的,看官方例子吧
    http://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols.gridview.rowupdating.aspx
      

  5.   

    主键不是只能有一个吗
    Names是复数,表示可以有多个,数据库中也可以有多个主键
    如果你只设置了一个,this.gvUsers.DataKeys[i][2]自然报错了,表示访问第i行的第3个主键
    你用for遍历行也是错误的,看官方例子吧
    http://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols.gridview.rowupdating.aspx
    按照官方做了:
     ClassLibrary1.User u=new ClassLibrary1.User();
           GridViewRow row = gvUsers.Rows[e.RowIndex];
           u.UserId = ((TextBox)(row.Cells[2].Controls[0])).Text;
           u.UserName = ((TextBox)(row.Cells[3].Controls[0])).Text;
           u.Sex = ((TextBox)(row.Cells[4].Controls[0])).Text;
                DateTime enter;
                try
                {
                    enter = Convert.ToDateTime(((TextBox)(row.Cells[5].Controls[0])).Text);
                    u.Birthday = enter;
                }
                catch (FormatException ex)
                {
                    System.Windows.Forms.MessageBox.Show("日期不正确。");
                }
            
           
            ClassLibrary1.teacherctrl.Update(u);
             gvUsers.EditIndex = -1;
         
             gvUsers.DataBind();
          还是那个问题:指定参数超出有效值范围
      

  6.   

    这种错误,Debug一下不就出来了?哎
      

  7.   

    打个断点,debug一下,DataKeys[i][2]的取值