【问题标题】:RaiseEvent between User Controls where there are multiple instances of the same controls on one page ASP.net用户控件之间的 RaiseEvent,其中一个页面上有相同控件的多个实例 ASP.net
【发布时间】:2013-07-31 15:54:18
【问题描述】:

当我有多个用户控件时,我尝试在用户控件“input.ascx”和“output.ascx”之间发送字符串时遇到问题。

这是父页面的 ASPX:

<uc:Input runat="server" id="Input1" />
<uc:Input runat="server" id="Input2" />

<uc:Output runat="server" id="Output1" />
<uc:Output runat="server" id="Output2" />

用户控制输入 ASCX:

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Button" />

用户控制输入 VB.net:

Public Shared Event Button1Click(ByVal s As String)

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim s As String = TextBox1.Text
    RaiseEvent Button1Click(s)
End Sub

用户控制输出 ASCX:

<%@ Reference Control="~/Input.ascx" %>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

用户控制输出 VB.net:

Public Sub New()
    AddHandler UCTestUcInput.Button1Click, AddressOf DisplayText
End Sub

Private Sub DisplayText(ByVal s As String)
    Label1.Text = s
End Sub

问题是,当我输入任一“input.ascx”时,它会同时显示在“output.ascx”中,而它应该只显示在相应的输出中(如 input1 对应于 output1)。

【问题讨论】:

    标签: asp.net vb.net user-controls raiseevent


    【解决方案1】:

    我发现这个问题的解决方案来自 2002 年关于 Code Project 的一篇旧文章。这是该文章ASP.NET User Controls - Notify One Control Of Changes In Other Control 的链接。在阅读了那篇文章并查看了示例代码后,我对上面的代码进行了以下更改。

    除了应该删除输出 ASPX 文件中的以下行之外,ASPX 文件没有任何更改。

    <%@ Reference Control="~/Input.ascx" %>
    

    首先添加一个名为 LabelChangeEventArgs 的新类。

    Public Class LabelChangeEventArgs
        Inherits EventArgs
    
        Private _LabelStr As String
    
        Public Property LabelText() As String
            Get
                Return _LabelStr
            End Get
            Set(value As String)
                _LabelStr = value
            End Set
        End Property
    End Class
    

    用户控制输入 VB.net:添加一个 Delegate 并使用新的 LableChangeEventArgs 类来处理字符串。

    Public Delegate Sub LabelChangeEventHandler(ByVal sender As Object, ByVal e As LabelChangeEventArgs)
    
    Partial Class UCInput
        Inherits System.Web.UI.UserControl
    
        Public Event OnLabelChanged As LabelChangeEventHandler
    
        Protected Sub OnButtonClick(sender As Object, e As EventArgs)
            Dim args As New LabelChangeEventArgs
            args.LabelText = TextBox1.Text
            RaiseEvent OnLabelChanged(Me, args)
        End Sub
    
    End Class
    

    用户控制输出 VB.net:您制作一个 sub 来接收 args 并更改标签。

    Public Sub LabelChange(sender As Object, args As LabelChangeEventArgs)
        If args IsNot Nothing Then
            Label1.Text = args.LabelText
        End If
    End Sub
    

    并在父页面代码文件中将控件连接在一起。

    Protected Sub WireHandles() Handles Me.Init
        AddHandler UCInput1.OnLabelChanged, AddressOf UCOutput1.LabelChange
        AddHandler UCInput2.OnLabelChanged, AddressOf UCOutput2.LabelChange
    End Sub
    

    这里是 src 文件的下载链接Link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-17
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多