一般在使用 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