asp.net GridView手寫事件,包括取主鍵、取值、更新、選擇、刪除

來源:互聯網
上載者:User

剛才在調整網站友情連結管理頁面,裡面有個簡單的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" />
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.