通过链接按钮单击从一个用户控件到另一个用户控件

Aar*_*ron 4 vb.net asp.net user-controls

我在同一页面上有两个用户控件.一个包含显示导航链接的ListView,当用户单击ListView中的buttonlink时,应更新第二个用户控件.我怎样才能做到这一点?

Tim*_*ter 6

  1. UserControl A应该处理按钮单击并引发 UserControl中声明的自定义事件
  2. 该页面处理此事件并调用UserControl B的公共方法来更新其内容

您可以通过EventArgs将UserControl A中的必要信息传递到页面(或者将UserControl本身作为参数传递并使用它的公共属性).

然后页面通过方法参数将参数传递给UserControl B,或者在调用Update-Method 之前更改它的公共属性.


以下是您请求的示例代码.抱歉无意义的命名,但你没有告诉这是什么.您应该使用可读变量,属性,方法和事件名称.

使用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>
Run Code Online (Sandbox Code Playgroud)

从代码隐藏中删除了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
Run Code Online (Sandbox Code Playgroud)

简单的UserControl B只有一个Label(ascx):

<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="UserControlB.ascx.vb" Inherits="WebApplication1.UserControlB" %>
<asp:Label ID="Label1" runat="server"></asp:Label>
Run Code Online (Sandbox Code Playgroud)

随着Update在代码隐藏-方法:

Public Sub Update(showID As Int32)
    Me.Label1.Text = String.Format("Link {0} clicked", showID.ToString)
End Sub
Run Code Online (Sandbox Code Playgroud)

最后,这是Page(aspx)

<uc1:UsercontrolA ID="UC_A" runat="server" />
<br />
<uc2:UserControlB ID="UC_B" runat="server" />
Run Code Online (Sandbox Code Playgroud)

它控制UserControls.它处理来自UserControl A的事件并调用UpdateUserControl B提供的-Method:

Private Sub LinkClicked(sender As UserControlA, id As Integer) Handles UC_A.LinkClicked
    Me.UC_B.Update(id)
End Sub
Run Code Online (Sandbox Code Playgroud)

这种事件方法的优点是UserControls可以重复使用.您也可以在其他页面中使用UserControl A,即使它们不处理此事件也是如此.它是控制器的一部分,用于决定需要什么以及应该做什么.

UserControls作为规则不应该依赖于特定的控制器,否则它们是硬链接的而不是可重用的.这也是令人讨厌的错误的良好来源.UserControl可能是其他嵌套(用户)控件的控件,但不是页面本身的控件.

沟通摘要:

  • Page - > UserControl - >公共属性和方法
  • UserControl - >页面 - >事件
  • UserControl - > UserControl - > controller-UserControl采用page-role(见上)