剛才在調整網站友情連結管理頁面,裡面有個簡單的GridView。因為更改了架構,所以需要手工給GridView編寫編輯、刪除等事件。最近也經常碰到有人問我GridView的問題,於是寫成經驗之書以警後人。
圖片是本網站背景友情連結管理頁面:
前兩者的代碼比較固定,一般都是:
代碼如下 |
複製代碼 |
protected void gvFriendLink_RowEditing(object sender, GridViewEditEventArgs e) { gvFriendLink.EditIndex = e.NewEditIndex; FetchData(); }
protected void gvFriendLink_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) { gvFriendLink.EditIndex = -1; FetchData(); } |
其中,FetchData()是給GridView綁定資料的方法。EditIndex = -1的意思是退出編輯模式。
2. 在RowUpdating事件中的取值問題
2.1 取不到值
如果你直接存取GridView.Row[i].Cell[j].Text是沒用的。因為在編輯模式下,這個Cell裡其實是有控制項的,在這個例子裡是個TextBox。所以我們需要強制類型轉換一下:
代碼如下 |
複製代碼 |
protected void gvFriendLink_RowUpdating(object sender, GridViewUpdateEventArgs e) { GeekStudio.ORM.Model.FriendLink model = new GeekStudio.ORM.Model.FriendLink() { Id = Convert.ToInt32(((TextBox)gvFriendLink.Rows[gvFriendLink.EditIndex].Cells[1].Controls[0]).Text), Title = ((TextBox)gvFriendLink.Rows[gvFriendLink.EditIndex].Cells[2].Controls[0]).Text, Url = ((TextBox)gvFriendLink.Rows[gvFriendLink.EditIndex].Cells[3].Controls[0]).Text, OrderId = Convert.ToInt32(((TextBox)gvFriendLink.Rows[gvFriendLink.EditIndex].Cells[4].Controls[0]).Text) };
optFriendLink.Update(model);
gvFriendLink.EditIndex = -1; FetchData(); } |
2.2 取不到新值
如果你在GridView編輯的時候,明明填寫了新值,更新之後卻不變,比如儲存格裡原先是abc,你編輯的時候寫了abcd,走到更新事件中,擷取的值還是abc。這時候你要檢查,你是不是忘記判斷頁面PostBack了?
解決辦法:把資料繫結方法寫在if(!Page.IsPostBack)裡面
代碼如下 |
複製代碼 |
protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { FetchData(); } }
protected void FetchData() { gvFriendLink.DataSource = optFriendLink.GetModelList(0); gvFriendLink.DataBind(); } |
3. 手寫刪除事件
做刪除操作,我們只要編寫RowDeleting事件就可以:
代碼如下 |
複製代碼 |
protected void gvFriendLink_RowDeleting(object sender, GridViewDeleteEventArgs e) { int id = Convert.ToInt32(gvFriendLink.Rows[e.RowIndex].Cells[1].Text); optFriendLink.Delete(id); FetchData(); } |
4. 擷取主鍵的辦法
細心的童鞋會發現,在剛才的刪除事件中,我擷取主鍵的方法非常傻逼,居然是直接存取Cells[1],也就是第二個儲存格的值。但很多時候,項目裡要求GridView上不能顯示資料庫中的主鍵欄位,怎麼辦呢?
其實GridView內建訪問主鍵的屬性,叫做DataKey。
為了用這個屬性,你首先得給GridView指定一個DataKeyName
然後在代碼裡你就可以訪問某行對應的主鍵了:
代碼如下 |
複製代碼 |
int id = Convert.ToInt32(gvFriendLink.DataKeys[e.RowIndex].Value); |
5. GridView中選取某行的操作
我的友情連結模組沒有這個需求,所以給貼一個以前做的選課系統裡的例子:
代碼如下 |
複製代碼 |
protected void gvCourses_SelectedIndexChanged(object sender, EventArgs e) { int userId = uid; int courseId = Convert.ToInt32(gvCourses.SelectedRow.Cells[0].Text); dalUca.Add(new Course.Model.UserCourseAssociation() { UserId = userId, CourseId = courseId }); FetchAllCourse(); FetchUserCourse(userId); } |
其實就是一個SelectedIndexChanged事件。但前提是你的GridView裡必須有某個按鈕可以觸發這個事件:
一般是一個Select Command:
代碼如下 |
複製代碼 |
<asp:CommandField ShowSelectButton="True" /> |