GridView模板之处理模板中的事件
有时候你可能会需要响应那些由模板列中的控件产生的事件。例如你修改了前面示例中的代码,不使用静态图标而是用ImageButton控件创建一组可单击的图片链接:
问题是在模板中加入一个控件后,GridView为每个数据项创建一个该控件的副本。这样当单击ImageButton控件时,你需要通过这种方式确定被单击的图片属于哪一行
解决这一问题的办法是使用GridView的事件而不是按钮事件。GridView.RowCommand事件就是起这个作用的,因为它在模板中的任意按钮被单击时发生。模板中的控件事件变成包含控件中的事件的过程叫做事件冒泡。
当然,你还是要借助某种方式向RowCommand事件传递信息以识别事件究竟发生在哪一行。奥妙在于所有按钮控件的两个字符串属性:CommandName和CommandArgument。你可以为CommandName设置一个描述性的名字从而区分当前的单击时发生在ImageButton上还是GridView中的其他按钮上。CommandArgument提供一段与行有关的信息,通过它你可以区分被单击的行。可以通过数据绑定表达式提供这一信息。
下面是修改过的ImageButton标记:
下面是响应ImageButton单击所需要的代码:
这儿只是简单的在一个标记上显示ProductID
<asp:TemplateField HeaderText="Status">
<ItemTemplate>
<asp:ImageButton ID="ImageButton1" runat="server"
ImageUrl='<%# GetStatusPicture(Container.DataItem) %>' />
</ItemTemplate>
</asp:TemplateField>
<ItemTemplate>
<asp:ImageButton ID="ImageButton1" runat="server"
ImageUrl='<%# GetStatusPicture(Container.DataItem) %>' />
</ItemTemplate>
</asp:TemplateField>
问题是在模板中加入一个控件后,GridView为每个数据项创建一个该控件的副本。这样当单击ImageButton控件时,你需要通过这种方式确定被单击的图片属于哪一行
解决这一问题的办法是使用GridView的事件而不是按钮事件。GridView.RowCommand事件就是起这个作用的,因为它在模板中的任意按钮被单击时发生。模板中的控件事件变成包含控件中的事件的过程叫做事件冒泡。
当然,你还是要借助某种方式向RowCommand事件传递信息以识别事件究竟发生在哪一行。奥妙在于所有按钮控件的两个字符串属性:CommandName和CommandArgument。你可以为CommandName设置一个描述性的名字从而区分当前的单击时发生在ImageButton上还是GridView中的其他按钮上。CommandArgument提供一段与行有关的信息,通过它你可以区分被单击的行。可以通过数据绑定表达式提供这一信息。
下面是修改过的ImageButton标记:
<asp:TemplateField HeaderText="Status">
<ItemTemplate>
<asp:ImageButton ID="ImageButton1" runat="server"
ImageUrl='<%# GetStatusPicture(Container.DataItem) %>'
CommandName="StatusClick"
CommandArgument='<%# Eval("ProductID") %>'
/>
</ItemTemplate>
</asp:TemplateField>
<ItemTemplate>
<asp:ImageButton ID="ImageButton1" runat="server"
ImageUrl='<%# GetStatusPicture(Container.DataItem) %>'
CommandName="StatusClick"
CommandArgument='<%# Eval("ProductID") %>'
/>
</ItemTemplate>
</asp:TemplateField>
下面是响应ImageButton单击所需要的代码:
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "StatusClick")
lblInfo.Text = "You clicked product #" + e.CommandArgument;
}
{
if (e.CommandName == "StatusClick")
lblInfo.Text = "You clicked product #" + e.CommandArgument;
}
这儿只是简单的在一个标记上显示ProductID