为什么不改用 asp:Repeater 控件。从那里您可以将 asp:LinkButton 添加到转发器模板并捕获回帖。 Repeater 控件的设计目的与您对循环执行的操作相同,即创建用于数据收集的模板。这将允许使用带有 runat="server" 的控件来处理回发事件。
以下是一些讨论使用中继器的页面:
http://www.aspnettutorials.com/tutorials/controls/repeater-vb.aspx
http://www.dotnetcurry.com/ShowArticle.aspx?ID=663
您可能希望使用 OnItemDataBound 事件来处理 runat="server" 的控件:
fetching values from the repeater control in ItemDataBound event
http://www.codeguru.com/csharp/.net/net_asp/tutorials/article.php/c12065
以及关于如何处理按钮点击回发事件的文章:
button event in nested repeater
ASP.Net: why is my button's click/command events not binding/firing in a repeater?
我的 VB.NET 生锈了,但我很乐意帮助您解决您可能遇到的任何问题。
编辑 - 添加代码示例
我的中继器:
<asp:Repeater runat="server" ID="repTemplate">
<ItemTemplate>
<div>
<%# DataBinder.Eval(Container.DataItem, "Key")%> - <%# DataBinder.Eval(Container.DataItem, "Value") %>
<asp:LinkButton OnClick="RepeaterLinkButton1_Click" runat="server" ID="linkDelete" Text="X" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "Key") %>' />
</div>
</ItemTemplate>
</asp:Repeater>
以及页面后面的代码
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If IsPostBack = False Then
Dim data As Dictionary(Of Integer, String) = New Dictionary(Of Integer, String)()
data.Add(1, "Test #1")
data.Add(2, "Test #2")
data.Add(3, "Test #3")
data.Add(4, "Test #4")
data.Add(5, "Test #5")
Me.repTemplate.DataSource = data
Me.repTemplate.DataBind()
End If
End Sub
Protected Sub RepeaterLinkButton1_Click(sender As Object, e As EventArgs)
Dim linkButton As LinkButton = sender
Dim id As String = linkButton.CommandArgument
'TODO: Delete from the database based on ID
'TODO: Reload the data to the repeater
End Sub
通过在代码的 HTML 视图中设置 OnClick 函数并将 CommandArgument 设置为 ID,您可以捕获行的 ID 并执行您想要的任何操作。请记住,我的示例以数据字典为例,因此“键”是项目的唯一键,“值”是存储在其中的内容,这就是 HTML 使用“键”的原因/ “值”名称。