关于gridviw中的Rows和DataKeys
情况是这样的:我想在gridview里面通过(编辑-修改)来修改我在数据库里面所定义的主键,于是把要修改的ID值在编辑的时候保存在ViewState里面。下面的代码可以正确执行修改操作。
//GridView的编辑事件
protected void gvShow_RowEditing(object sender, GridViewEditEventArgs e)
{
gvShow.EditIndex = e.NewEditIndex;
ViewState["gvID"] = gvShow.DataKeys[e.NewEditIndex].Value.ToString();//1正确的代码,后面我想修改一下
DBind();//执行数据绑定,将数据库里面的值绑定到gvShow中
}
//GridView的更新事件
protected void gvShow_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
TextBox tb = (TextBox)gvShow.Rows[e.RowIndex].Cells[0].Controls[0];
string sID = tb.Text;
tb = (TextBox)gvShow.Rows[e.RowIndex].Cells[1].Controls[0];
string sName = tb.Text;
tb = (TextBox)gvShow.Rows[e.RowIndex].Cells[2].Controls[0];
string sPrice = tb.Text;
string sSql = "update BookStore set BookID = '" + sID + "', BookName = '" + sName + "', BookPrice = '" + sPrice + "' where BookID = '" + ViewState["gvID"] + "'";
DBHelper.Exec(sSql);//DBHelper为定义的通用访问类
gvShow.EditIndex = -1;
DBind();
}
但是我后来把1处的代码换成
ViewState["gvID"] = ((TextBox)(gvShow.Rows[e.NewEditIndex].Cells[0].Controls[0])).Text.ToString();
执行代码的时候就报错了:
指定的参数已超出有效值的范围。
参数名: index
但是我自己分析觉得1处改动前后的代码所代表的意义是一样的。
请问高人可以解释一下吗? --------------------编程问答-------------------- 有人在吗? --------------------编程问答-------------------- protected void gv_RowEditing(object sender, GridViewEditEventArgs e)
{
gv.EditIndex =e.NewEditIndex;
BindData();
}
protected void gv_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
gv.EditIndex = e.RowIndex;
int id = int.Parse(gv.DataKeys[e.RowIndex].Value.ToString());
string strDesc = ((TextBox)gv.Rows[e.RowIndex].FindControl("txt")).Text.Trim();
gv.EditIndex = -1;
BindData();
} --------------------编程问答--------------------
UP!! up!! --------------------编程问答-------------------- 修改所定义的主键?
想想吧。这个主键合适吗?
例如每一张发票都有唯一的编号,那么你可以用发票号做主键吗?不能。因为电脑记录上的发票号完全可能修改,可能在业务需求描述中被描述为可修改的东西就不能用在做主键。 --------------------编程问答-------------------- 是因為TextBox的問題吧,你先定義要查找的TextBox,因為是綁定的所以要設定TextBox的ID.
TextBox txtBox =(TextBox) GridView1.Rows[e.NewEditIndex].Cells[0].FindControl("綁定的文本框id");
txtBox.ID= e.NewEditIndex.ToString();
ViewState["gvID"] = txtBox.Text.ToString();
另外如果你是用的自帶的分頁的話,也可能會出現這個問題,不分頁的話就沒問題!
--------------------编程问答-------------------- 在数据结构上增加一个自增字段作为行标识(记住,常规手段下它是只读的),比如叫做:NewId
当然,最好是顺便设NewId为主键,不改也行
补充:.NET技术 , ASP.NET