[GridView] 自訂動作按鈕

偶而我們會需要在 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 了。所以採用這種做法才是最簡單容易的。 


Dev 2Share @ 點部落