当前位置:编程学习 > C#/ASP.NET >>

关于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();
        } --------------------编程问答--------------------
引用 2 楼 wuyq11 的回复:
protected void gv_RowEditing(object sender, GridViewEditEventArgs e)
{
gv.EditIndex =e.NewEditIndex;
BindData();
}

protected void gv_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
gv……


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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,