偶而我們會需要在 GridView 中進行一些除了 Select、Update、Delete 動作之外的行為;又或許你想要取代原來的 Select、Update 和 Delete 等動作。這時,你可以在 GridView 中自行加入按鈕欄位 (ButtonField)。不過,你應該如何撰寫這個行為的程式呢...
偶而我們會需要在 GridView 中進行一些除了 Select、Update、Delete 動作之外的行為;又或許你想要取代原來的 Select、Update 和 Delete 等動作。這時,你可以在 GridView 中自行加入按鈕欄位 (ButtonField)。不過,你應該如何撰寫這個行為的程式呢?
首先,你必須在 GridView 中加入按鈕欄位:
<asp:GridView ID="gv" runat="server" AutoGenerateColumns="False" DataKeyNames="myKey" ...>
<asp:BoundField DataField="myKey" ... />
...
<asp:ButtonField CommandName="Fly" Text="Fly" />
接著,切換到程式碼檢視中並加入 GridView 的 RowCommand 事件處理程序,並加上以下的程式碼:
Protected Sub gv_RowCommand(...)
If e.CommandName = "Fly" Then
Dim myKey As String = gv.Rows(e.CommandArgument).Cells(0).Text
...
End If
End Sub
你會發現其實 e.CommandArgument 會帶出所按按鈕在 GridView 裡面的列號。
在以上程式中假設你把 DataKey 欄位放在 GridView 的第一欄(如同範例所示)。透過上述方式,你就可以取得 DataKey 並放在 myKey 變數中。
不過,你也可以寫成如下的樣子,其結果是相同的:
Protected Sub gv_RowCommand(...)
If e.CommandName = "Fly" Then
Dim myKey As String = gv.DataKeys(e.CommandArgument).Value
...
End If
End Sub
在上述兩種寫法中,我個人比較建議第二種寫法。
不過還有一種更簡單的做法。那就是先把 Button Field 轉換為 Template Field,再加入 CommandArgument 參數,如下範例:
<asp:GridView ID="gv" runat="server" AutoGenerateColumns="False" DataKeyNames="myKey" ...> ... <asp:TemplateField ShowHeader="False"> <ItemTemplate> <asp:LinkButton CommandArgument='<%# Eval("myKey") %>' CommandName="Fly" Text="Fly" ... /> </ItemTemplate> </asp:TemplateField>
當你將它轉換成樣版並加上 CommandArgument 參數之後,你在 RowCommand 程序中就可以直接使用 e.CommandArgument 來取得 DataKey 了。所以採用這種做法才是最簡單容易的。