【问题标题】:button event in nested repeater嵌套中继器中的按钮事件
【发布时间】:2011-03-18 06:44:51
【问题描述】:

我正在使用嵌套中继器,而子中继器中有一个用户控件。

<asp:repeater>
<asp:repeater>
    <uc:userControl />
</asp:repeater>
</asp:repeater>

UserControl 将信息保存在数据库中,并将itemsaved 事件传递成功消息作为事件参数引发。

我确实在用户控件中有将引发的公共事件,但我无法在主页中绑定该事件。 (如果我能做到这一点,那就太好了)。

但我在父中继器的 itemcommand 中找到了另一种处理方法。首先它会触发用户控件的按钮事件,然后是转发器的 itemcommand。我可以在 itemcommand 中识别出用户控件的事件,但是如何传递信息是否成功保存?有什么方法可以将用户控件的按钮事件中的真/假(是否成功保存)传递给 itemcommand 事件?

【问题讨论】:

    标签: asp.net repeater


    【解决方案1】:

    您可以在页面中处理您的 UserControl 事件。您必须在内部中继器的ItemCreated-event 中添加处理程序。

    这是一个工作示例(VB.Net):

    主页代码隐藏:

    Public Class RepeaterTest
        Inherits System.Web.UI.Page
    
        Sub Page_Load(ByVal Sender As Object, ByVal e As EventArgs) Handles Me.Load
            If Not IsPostBack Then
                Dim comps As New List(Of Company)
                comps.Add(New Company("Microsoft"))
                comps.Add(New Company("Intel"))
                comps.Add(New Company("Dell"))
                Repeater1.DataSource = comps
                Repeater1.DataBind()
            End If
        End Sub
    
        Protected Sub Repeater1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs)
            Select Case e.Item.ItemType
                Case ListItemType.Item, ListItemType.AlternatingItem
                    Dim company As Company = DirectCast(e.Item.DataItem, Company)
                    Dim repeater2 As Repeater = DirectCast(e.Item.FindControl("Repeater2"), Repeater)
                    Dim deps As New List(Of Department)
                    deps.Add(New Department("purchasing", company))
                    deps.Add(New Department("management", company))
                    deps.Add(New Department("marketing", company))
                    deps.Add(New Department("logistics ", company))
                    repeater2.DataSource = deps
                    repeater2.DataBind()
            End Select
        End Sub
    
        Protected Sub Repeater2_ItemCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs)
            Select e.Item.ItemType
                Case ListItemType.Item, ListItemType.AlternatingItem
                    Dim uc_department As UC_Department = DirectCast(e.Item.FindControl("UC_Department1"), UC_Department)
                    '*** Here is all the "magic" ***'
                    AddHandler uc_department.NameChanged, AddressOf DepartmentSaved
            End Select
        End Sub
    
        Protected Sub Repeater2_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs)
            Select Case e.Item.ItemType
                Case ListItemType.Item, ListItemType.AlternatingItem
                    Dim department As Department = DirectCast(e.Item.DataItem, Department)
                    Dim uc_department As UC_Department = DirectCast(e.Item.FindControl("UC_Department1"), UC_Department)
                    uc_department.Department  = department
            End Select
        End Sub
    
        Private Sub DepartmentSaved(ByVal uc_Department As UC_Department)
            ' do something f.e. save to database '
        End Sub
    End Class
    
    <Serializable()>
    Public Class Company
        Public Sub New(ByVal name As String)
            Me.Name = name
        End Sub
        Public Property Name As String
        Public Overrides Function ToString() As String
            Return Me.Name
        End Function
    End Class
    
    <Serializable()>
    Public Class Department
        Public Sub New(ByVal name As String, ByVal company As Company)
            Me.Name = name
            Me.Company = company
        End Sub
    
        Public Property Name As String
        Public Property Company As Company
    
        Public Overrides Function ToString() As String
            Return Me.Name
        End Function
    End Class
    

    aspx:

       <asp:Repeater id="Repeater1" OnItemDataBound="Repeater1_ItemDataBound" runat="server">
             <HeaderTemplate>
                <table border="1">
                   <tr>
                      <td><b>Company</b></td>
                      <td><b>Departments</b></td>
                   </tr>
             </HeaderTemplate>
    
             <ItemTemplate>
                <tr>
                   <td> 
                      <%# DataBinder.Eval(Container.DataItem, "Name")%> 
                   </td>
                   <td> 
                       <asp:Repeater ID="Repeater2" OnItemCreated="Repeater2_ItemCreated" OnItemDataBound="Repeater2_ItemDataBound" runat="server">
                             <HeaderTemplate>
                                <table border="1">
                             </HeaderTemplate>
    
                             <ItemTemplate>
                                <tr>
                                   <td> 
                                      <uc1:UC_Department ID="UC_Department1" runat="server" />
                                   </td>
                                </tr>
                             </ItemTemplate>
    
                             <FooterTemplate>
                                </table>
                             </FooterTemplate>
                       </asp:Repeater>
                   </td>
                </tr>
             </ItemTemplate>
    
             <FooterTemplate>
                </table>
             </FooterTemplate>
    
          </asp:Repeater>
    

    用户控件的代码隐藏:

    Public Class UC_Department
        Inherits System.Web.UI.UserControl
    
        Public Event NameChanged(ByVal ucDepartment As UC_Department)
    
        Public Property Department As Department
            Get
                If ViewState("Company") Is Nothing Then Return Nothing
                Return New Department(Me.TxtName.Text, DirectCast(ViewState("Company"), Company))
            End Get
            Set(ByVal value As Department)
                Me.TxtName.Text = value.Name
                ViewState("Company") = value.Company
            End Set
        End Property
    
        Private Sub BtnSave_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BtnSave.Click
            RaiseEvent NameChanged(Me)
        End Sub
    End Class
    

    及其ascx:

    <%@ Control Language="vb" AutoEventWireup="false" CodeBehind="UC_Department.ascx.vb" Inherits="DemoProject.UC_Department" %>
    <asp:TextBox ID="TxtName" runat="server"></asp:TextBox>
    <asp:Button ID="BtnSave" runat="server" Text="Save" />
    

    【讨论】:

    • 我已经尝试过了,但它不是订阅事件的触发方法。(在你的情况下是 DepartmentSaved)。我认为嵌套中继器中的 AddHandler 不起作用。
    • @user655810:但这正是你的情况。嵌套中继器中的用户控件,相信我,它可以工作;)您在哪里添加了处理程序?您必须像在我的示例中那样将其添加到嵌套中继器的 ItemCreated 中,而不是在 ItemDataBound 中(与 ItemDataBound 相比,每次回发时都会调用 ItemCreated)。
    • Awesome 花费了大量时间试图解决这个问题。谢谢!! +1
    猜你喜欢
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多