您好,登录后才能下订单哦!
今天在使用GridView的RowUpdating来修改数据时,开始总是提示Index超出范围,反复查看了DataKeyNames的设置,发现它只设置了一个字段,因为之前一直不是太明白DataKeyNames的用途,所以才出了这个错误。原来我把DataKeyNames只设置了“UserID"这个字段,但后面的代码却如下:
string UserID=GridView1.DataKeys[e.RowIndex].Values[0].ToString(); string Username=GridView1.DataKeys[e.RowIndex].Values[1].ToString(); string Department=GridView1.DataKeys[e.RowIndex].Values[2].ToString(); string Company=GridView1.DataKeys[e.RowIndex].Values[3].ToString();
这样,因为它只设置了UserID这个字段,自然第二行的时候它就出错了,即是说,虽然在GridView里有四列,UserID,Username,Department,Company,但其中其实DataKeys集合中却只有一列UserID。
于是就改变思路,要怎么样去得到其它不是主键列(即不在DataKeyNames里)的值从而把它放入更新语句呢?对于我这样的初学者来说,其实对于GridView的一些属性,方法还不是很熟的情况下,这是一个问题。
于是在网上百度,Google了很多前辈们的文章,各种答案层出不穷,其中有很多都是要把对应的那个列做显示转换如(Label)GridView1.....,而且后面有用DataKeys[e.RowIndex]的,有用Rows[e.RowIndex]的,现在DataKeys明显已经不行,所以我想应该是用Rows,但怎么用Rows集合来表示行中其它列的值呢?经过一番搜索,加上用Response.Write来尝试输出值(使用ClassicASP时养成的习惯),最后得出应该是如下格式:
string Username=((TextBox)this.GridView1.Rows[e.RowIndex].Cells[1].Controls[0]).Text; string Department=((TextBox)this.GridView1.Rows[e.RowIndex].Cells[2].Controls[0]).Text; string Company=((TextBox)this.GridView1.Rows[e.RowIndex].Cells[3].Controls[0]).Text;
因为我并没有使用任何模板,用的只是最简单,也是默认的BoundField,所以(我自己想当然,是不是还要以后验证)我想应该把它显示转换成了TextBox.这样终于算是成功了。
整个过程中,开始我认为是第一行(stringUserID=GridView1.DataKeys[e.RowIndex].Values[0].ToString();)的问题,弄了很久,后来通过Response.Write来尝试输出第一列的值时才发现,原来第一行是能正确输出当前UserID值的,只是后面的三列都不行。所以发现原来一些以前的老习惯有时也是很有帮助的。
前台GridView代码如下:
<asp:GridView ID="GridView1" runat="server" Width="70%" CellPadding="4" ForeColor="#333333" AutoGenerateColumns="False" AllowPaging="True" PageSize="20" OnRowEditing="GridView1_RowEditing" OnRowUpdating="GridView1_RowUpdating" DataKeyNames="UserID" OnPageIndexChanging="GridView1_PageIndexChanging" OnRowDataBound="GridView1_RowDataBound" GridLines="None"> <Columns> <asp:BoundField HeaderText="User ID" DataField="UserID" /> <asp:BoundField HeaderText="User Name" DataField="Username" /> <asp:BoundField HeaderText="Department" DataField="Department" /> <asp:BoundField HeaderText="Division" DataField="Division" /> <asp:CommandField HeaderText="OPT" ShowDeleteButton="True" ShowEditButton="True" /> </Columns>
RowDating代码如下:
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) { // Response.Write(GridView1.DataKeys[e.RowIndex].Values[0].ToString()+"<br />"); //通过这两行才发现问题的。 // Response.Write(((TextBox)this.GridView1.Rows[e.RowIndex].Cells[1].Controls[0]).Text); string UserID=GridView1.DataKeys[e.RowIndex].Values[0].ToString(); string Username=((TextBox)this.GridView1.Rows[e.RowIndex].Cells[1].Controls[0]).Text; string Department=((TextBox)this.GridView1.Rows[e.RowIndex].Cells[2].Controls[0]).Text; string Division=((TextBox)this.GridView1.Rows[e.RowIndex].Cells[3].Controls[0]).Text; string connstr="Server=服务器为;UID=用户名;PWD=密码;Database=test;"; string sqlstr="UPDATE UserInfo SET Username='"+Username+"',Department='"+Department+"',Company='"+Company+"' WHERE UserID='"+UserID+"'"; try { SqlConnection conn=new SqlConnection(connstr); if(conn.State.ToString()=="Closed") conn.Open(); SqlCommand comm=new SqlCommand(sqlstr,conn); comm.ExecuteNonQuery(); comm.Dispose(); if(conn.State.ToString()=="Open") conn.Close(); GridView1.EditIndex=-1; GridViewBind(); } catch(Exception ex) { Response.Write("Database Error, Reason: "+ex.Message); } }
赶紧记下供以后参考。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。