要如何在GridView中按下Button的事件中取得資料主鍵值呢?
最近跟同事Review程式,當在GridView中的某個Button Click事件中,
要取得資料主鍵值的方式蠻多樣的,所以就整理2個比較容易的方式下來。
1.如果使用非系統定的CommandName如 Select, Edit, Update, Delete 等等,詳細請參考 GridView.RowCommand 事件
則在.aspx中建立 TemplateField 裡面放入Button,設定 CommandArgument, 如下,
<asp:TemplateField HeaderText="Delete" ShowHeader="False" >
<ItemTemplate>
<asp:Button ID="btnDelete" runat="server" CausesValidation="False" CommandName="Del"
Text="Delete" Height="20px" CommandArgument='<%# Eval("custid") %>' >
</ItemTemplate>
</asp:TemplateField>
然後在.aspx.cs中的GridView_RowCommand事件中處理它,
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Del")
{
//取得 custid 的值
var custid = e.CommandArgument;
// ... 做後面要做的事情 .....
}
}
2.那如果使用系統的CommandName,如 Delete,那要如何快速取得 custid 呢?
在GridView屬性中設定 DataKeyNames 及 Handle 系統對應的事件,如 OnRowDeleting ,如下,
<asp:GridView ID="GridView1" runat="server" DataKeyNames="custid"
OnRowDeleting="GridView1_RowDeleting" >
......
</asp:GridView>
在.aspx.cs中的 GridView1_RowDeleting Method 中處理 Delete,如下,
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
//取得 custid 的值 Way1,
var custId = e.Keys[0].ToString();
//取得 custid 的值 Way2, 從 DataKeys 取得
var rowindex = e.RowIndex;
var custid = this.gvCustomers.DataKeys[rowindex].Value;
// ... 做後面要做的事情 .....
}
另外,設定取得RowIndex有使用 ((GridViewRow) Container).RowIndex ,
也可以使用 Container.DataItemIndex 哦! 如下,
CommandArgument="<%# Container.DataItemIndex %>"
or
CommandArgument="<%# ((GridViewRow) Container).RowIndex %>"
當然,在現實狀況中,可能只能在某些事件中去處理,那就要依當下最適合的狀況來調整程式的寫法哦!
註:
在GridView中使用Button設定CommandName時要注意名稱是否跟系統一些預設的名稱一樣,
如果一樣的話,按下 Click 後,除了會觸發 RowCommand 事件外,還會再觸發 系統定義的事件哦!
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^