您好,登錄后才能下訂單哦!
今天在使用GridView的RowUpdating來修改數(shù)據(jù)時(shí),開始總是提示Index超出范圍,反復(fù)查看了DataKeyNames的設(shè)置,發(fā)現(xiàn)它只設(shè)置了一個(gè)字段,因?yàn)橹耙恢辈皇翘靼譊ataKeyNames的用途,所以才出了這個(gè)錯(cuò)誤。原來我把DataKeyNames只設(shè)置了“UserID"這個(gè)字段,但后面的代碼卻如下:
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();
這樣,因?yàn)樗辉O(shè)置了UserID這個(gè)字段,自然第二行的時(shí)候它就出錯(cuò)了,即是說,雖然在GridView里有四列,UserID,Username,Department,Company,但其中其實(shí)DataKeys集合中卻只有一列UserID。
于是就改變思路,要怎么樣去得到其它不是主鍵列(即不在DataKeyNames里)的值從而把它放入更新語句呢?對于我這樣的初學(xué)者來說,其實(shí)對于GridView的一些屬性,方法還不是很熟的情況下,這是一個(gè)問題。
于是在網(wǎng)上百度,Google了很多前輩們的文章,各種答案層出不窮,其中有很多都是要把對應(yīng)的那個(gè)列做顯示轉(zhuǎn)換如(Label)GridView1.....,而且后面有用DataKeys[e.RowIndex]的,有用Rows[e.RowIndex]的,現(xiàn)在DataKeys明顯已經(jīng)不行,所以我想應(yīng)該是用Rows,但怎么用Rows集合來表示行中其它列的值呢?經(jīng)過一番搜索,加上用Response.Write來嘗試輸出值(使用ClassicASP時(shí)養(yǎng)成的習(xí)慣),最后得出應(yīng)該是如下格式:
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;
因?yàn)槲也]有使用任何模板,用的只是最簡單,也是默認(rèn)的BoundField,所以(我自己想當(dāng)然,是不是還要以后驗(yàn)證)我想應(yīng)該把它顯示轉(zhuǎn)換成了TextBox.這樣終于算是成功了。
整個(gè)過程中,開始我認(rèn)為是第一行(stringUserID=GridView1.DataKeys[e.RowIndex].Values[0].ToString();)的問題,弄了很久,后來通過Response.Write來嘗試輸出第一列的值時(shí)才發(fā)現(xiàn),原來第一行是能正確輸出當(dāng)前UserID值的,只是后面的三列都不行。所以發(fā)現(xiàn)原來一些以前的老習(xí)慣有時(shí)也是很有幫助的。
前臺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 />"); //通過這兩行才發(fā)現(xiàn)問題的。 // 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=服務(wù)器為;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); } }
趕緊記下供以后參考。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。