将一个用户控件中的链接按钮点击传递到另一个用户控件

4

我在同一个页面上有两个用户控件。其中一个包含一个ListView,用于显示导航链接,第二个用户控件应在用户单击ListView中的buttonlink时更新。我该如何做到这一点?

1个回答

6
  1. 用户控件A应处理按钮点击事件以及在用户控件中声明的自定义事件触发
  2. 页面处理此事件并调用用户控件B的公共方法来更新其内容。

您可以通过EventArgs传递必要的信息从用户控件A到页面(或将用户控件本身作为参数传递并使用其公共属性)。

然后页面通过方法参数或更改其公共属性将参数传递给用户控件B,然后调用Update-方法。


这是您所请求的样本代码。 抱歉,由于您没有说明具体内容,命名可能不太有意义。应使用易读的变量、属性、方法和事件名称。 带 ListView 的 UserControl A 已经被简化了。
<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="UsercontrolA.ascx.vb" Inherits="WebApplication1.UserControlA" %>
<asp:ListView ID="ListView1" runat="server">
    <ItemTemplate>
        <asp:LinkButton ID="LinkButton1" 
        CommandName="LinkClick" 
        CommandArgument='<%#Eval("ID") %>' 
        runat="server" 
        Text='<%#Eval("Text") %>'></asp:LinkButton>
    </ItemTemplate>
</asp:ListView>

从代码后台中移除了ListView的数据绑定,因为这并不重要。重要的是处理ListView的ItemCommand事件并引发自定义事件:
Public Event LinkClicked(sender As UserControlA, id As Int32)

Private Sub LV_ItemCommand(sender As Object, e As ListViewCommandEventArgs) Handles ListView1.ItemCommand
    If e.CommandName = "LinkClick" Then
        Dim id = CType(e.CommandArgument, Int32)
        ' This is the best way for UC's to commmunicate with the page: '
        RaiseEvent LinkClicked(Me, id)
    End If
End Sub

这是一个简单的UserControl B,只包含一个Label(ascx):

<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="UserControlB.ascx.vb" Inherits="WebApplication1.UserControlB" %>
<asp:Label ID="Label1" runat="server"></asp:Label>

在后台代码中有一个“Update”方法:
Public Sub Update(showID As Int32)
    Me.Label1.Text = String.Format("Link {0} clicked", showID.ToString)
End Sub

最后,这是页面(aspx)。
<uc1:UsercontrolA ID="UC_A" runat="server" />
<br />
<uc2:UserControlB ID="UC_B" runat="server" />

它控制两个用户控件。它处理来自用户控件A的事件,并调用用户控件B提供的Update方法:
Private Sub LinkClicked(sender As UserControlA, id As Integer) Handles UC_A.LinkClicked
    Me.UC_B.Update(id)
End Sub

这种事件驱动方法的优点在于UserControl保持可重用性。即使在不处理此事件的其他页面中,您也可以在其他页面中使用UserControl A。决定需要什么和应该做什么是控制器的一部分。
通常情况下,UserControls不应依赖于特定的控制器,否则它们将被硬链接并且无法重用。这也会导致讨厌的错误。UserControl可能是其他嵌套(User-)Controls的控制器,但不是页面本身的控制器。 通信摘要
  • 页面 -> UserControl ->公共属性和方法
  • UserControl -> 页面 -> 事件
  • UserControl -> UserControl -> 控制器UserControl采用页面角色(见上文)

能否提供一些示例代码?我正在尝试做这个,但遇到了困难。谢谢。 - Aaron
@Aaron:不用谢。刚刚为这种方法添加了一份解释。 - Tim Schmelter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接