2011年6月29日 星期三

讓 GridView 的 CommandArgument 傳遞多個參數

一般在使用 GridView 時,如果想要在 RowCommand 事件取得識別資訊,通常都可以事先在 CommandArgument 寫好。但如果需要同時傳入多個參數時,是否也可以達到呢?可以的,不難,慢慢來。

為了測試方便,建立了一個 testData.xml 檔:
<?xml version="1.0" encoding="utf-8" ?>
<data>
  <row id="001" name="paladin"></row>
  <row id="002" name="ltt"></row>  
</data>

接著在 testData.aspx 頁面,使用了 XmlDataSouce 將剛剛的 xml 當作資料來源。



繼續將我的 gridview 完成:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="XmlDataSource1" OnRowCommand="GridView1_RowCommand">
    <Columns>
        <asp:BoundField DataField="id" HeaderText="id" SortExpression="id" />                
        <asp:TemplateField HeaderText="name">
            <ItemTemplate>
                <asp:LinkButton ID="btnDetail" runat="server" CommandName="ViewDetail" CommandArgument='<%#Eval("id")+","+Eval("name") %>'><%#Eval("name") %></asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

最後,在 testData.aspx.cs 的 GridView1_RowCommand() 事件,將使用者點選的資料顯示出來:

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "ViewDetail")
    {
        Response.Write(string.Format("Selected ID:{0};Selected Name:{1}", 
            e.CommandArgument.ToString().Split(',')[0].Trim(), 
            e.CommandArgument.ToString().Split(',')[1].Trim()));
    }
}
 

結果如下:

最主要的重點,在於 CommandArgument 的使用方式:

CommandArgument='<%#Eval("id")+","+Eval("name") %>'

先用  '<%# ... %>' 把整個內容包括起來,而兩個參數間,則是透過 "," 來區隔,並以 「+」來串接。

日後不管是要串幾個,都不再是問題了。

此外,透過這方式傳參數,去檢視原始碼,也不會出現 CommandArgument 所指派的內容。
<table cellspacing="0" rules="all" border="1" id="GridView1" style="border-collapse:collapse;">
<tr>
    <th scope="col">id</th><th scope="col">name</th>
</tr><tr>
    <td>001</td><td>
        <a id="GridView1_ctl02_btnDetail" href="javascript:__doPostBack('GridView1$ctl02$btnDetail','')">paladin</a>
    </td>
</tr><tr>
    <td>002</td><td>
        <a id="GridView1_ctl03_btnDetail" href="javascript:__doPostBack('GridView1$ctl03$btnDetail','')">ltt</a>
    </td>
</tr>
</table>

注意到了嗎?HTML 原始碼裡,這個超連結點選後,會觸發 __doPostBack ,但並不會暴露出我們所傳遞多個參數的訊息。

<a id="GridView1_ctl03_btnDetail" href="javascript:__doPostBack('GridView1$ctl03$btnDetail','')">ltt</a>

參考:
01:Passing Multiple value in Command Argument
02:Pass multiple values to Command Argument

1 則留言: