[ASP.NET]在GridView中按下Button,取得資料主鍵值的方式

要如何在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:從零開始的軟體開發生活

請大家繼續支持 ^_^