只需使用按钮(或ImageButton)标准点击事件即可。
所以,说这个ListView:
<asp:ListView ID="ListView1" runat="server" DataKeyNames="ID" >
<ItemTemplate>
<tr style="">
<td><asp:Label ID="FighterLabel" runat="server" Text='<%# Eval("Fighter") %>' /></td>
<td><asp:Label ID="EngineLabel" runat="server" Text='<%# Eval("Engine") %>' /></td>
<td><asp:Label ID="ThrustLabel" runat="server" Text='<%# Eval("Thrust") %>' /></td>
<td><asp:Label ID="DescriptionLabel" runat="server" Text='<%# Eval("Description") %>' /></td>
<td>
<asp:ImageButton ID="ImageView" runat="server" Width="200px"
ImageUrl='<%# Eval("ImagePath") %>'
OnClick="ImageView_Click"
/>
</td>
</tr>
</ItemTemplate>
<LayoutTemplate>
<table id="itemPlaceholderContainer" runat="server" class="table table-hover">
<tr runat="server" style="">
<th runat="server">Fighter</th>
<th runat="server">Engine</th>
<th runat="server">Thrust</th>
<th runat="server">Description</th>
<th runat="server">View</th>
</tr>
<tr id="itemPlaceholder" runat="server">
</tr>
</table>
</LayoutTemplate>
</asp:ListView>
请注意,如果可能,我强烈建议对 GridView 或 ListView 使用数据键。原因是您可以轻松获取数据库 PK 行值,但不必在标记中公开甚至显示数据库 PK 行值。
所以,上面加载的代码是这样的:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
LoadData();
}
void LoadData()
{
ListView1.DataSource =
General.MyRst("SELECT * FROM Fighters ORDER BY Fighter");
ListView1.DataBind();
}
现在的结果是这样的:
因此,在上面,我们有一个按钮单击(图像按钮)。
下面展示了简单的按钮点击事件如何获取行信息。
protected void ImageView_Click(object sender, ImageClickEventArgs e)
{
ImageButton btn = (ImageButton)sender;
ListViewItem lvRow = (ListViewItem)btn.NamingContainer;
Debug.Print($"Row index click = {lvRow.DisplayIndex}");
int PK = Convert.ToInt32(ListView1.DataKeys[lvRow.DisplayIndex]);
Debug.Print($"Data base primary key value = {PK}");
Debug.Print($"Image URL of button click = {btn.ImageUrl}");
// get control value from the row.
Label Engine = (Label)lvRow.FindControl("EngineLabel");
Debug.Print($"Engine = {Engine.Text}");
}
因此,上面展示了如何获取信息行索引、数据库 PK 值,甚至如何从给定行中提取控件。
ListView、Repeater、GridView 等都支持使用“命名容器”,这将返回行单击对象。
在示例标记中,您没有显示行单击是如何发生的。但是,作为一般规则,您要从中提取当前行值的任何控件?
此类控件应该是服务器端控件,像大多数控件一样具有“id”,因此您可以使用 findcontrol 从给定控件获取值。
在某些情况下,为了“轻松”编码,我经常会动态地添加一些附加按钮属性。
所以,点击上面的图像按钮可以这样说:
<asp:ImageButton ID="ImageView" runat="server" Width="200px"
ImageUrl='<%# Eval("ImagePath") %>'
OnClick="ImageView_Click"
FighterName = '<%# Eval("Fighter") %>'
PKID = '<%# Eval("ID") %>'
/>
所以,我“编造”了 PKID 和 FighterName 属性。
因此,在按钮单击的代码后面,我可以简单地使用添加到按钮单击的“自定义”属性。
例如:
protected void ImageView_Click(object sender, ImageClickEventArgs e)
{
ImageButton btn = (ImageButton)sender;
Debug.Print($"Fighter name = {btn.Attributes["FighterName"]}");
Debug.Print($"PKID = {btn.Attributes["PKID"]}");
因此,在大多数情况下,您可以(并且应该)使用行项的 FindControl 方法。但是,为了便于使用,我经常会在给定的行按钮单击中添加一些额外的自定义属性。