索引超出范围,必须为非负值并小于集合大小 本帖最后由 u010691794 于 2013-07-30 10:20:26 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你的DataKeyNames主键设置了几个? 用C#编辑,这样贴出来看不清。this.gvUsers.DataKeys[i][2],2超出范围了。 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; } } 主键不是只能有一个吗Names是复数,表示可以有多个,数据库中也可以有多个主键如果你只设置了一个,this.gvUsers.DataKeys[i][2]自然报错了,表示访问第i行的第3个主键你用for遍历行也是错误的,看官方例子吧http://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols.gridview.rowupdating.aspx 主键不是只能有一个吗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(); 还是那个问题:指定参数超出有效值范围 这种错误,Debug一下不就出来了?哎 打个断点,debug一下,DataKeys[i][2]的取值 C#索引超出范围 可以在自己编的程序中调用报表设计器(.rdlc文件)吗? c#拷贝excel至word 定义变量,后面加个问号是什么意思?? vista 安装SQL Server 2005 提示安装补丁的问题 关于项目开发(急) 关于BASE64解码及汉字转换的问题 winform 窗体设计时出错,但程序可以运行 ,求帮忙! 关于IL到底是什么类型的 vs7中文版汉化到了程度(小弟使用英文版),MSDN汉化了吗???? WINFORM DataGridView的分页定位 求正则
this.gvUsers.DataKeys[i][2],2超出范围了。
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; }
}
Names是复数,表示可以有多个,数据库中也可以有多个主键
如果你只设置了一个,this.gvUsers.DataKeys[i][2]自然报错了,表示访问第i行的第3个主键
你用for遍历行也是错误的,看官方例子吧
http://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols.gridview.rowupdating.aspx
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();
还是那个问题:指定参数超出有效值范围