在嵌套的中继器按钮事件 [英] button event in nested repeater

查看:95
本文介绍了在嵌套的中继器按钮事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用嵌套的中继器和中继孩子中有一个用户控件。

I am using nested repeater and child repeater has a user control in it.

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

用户控件保存在数据库中的信息,提高itemsaved事件传球成功消息作为事件参数。

UserControl saves the information in database and raise the itemsaved event passing success message as event args.

我有在用户控件将被提出,但没有办法,我可以在主要页面绑定事件公共事件。 (这将是非常好的,如果我能做到这一点)。

I do have public event in usercontrol that will be raised but there is no way I can bind that event in the main page. (it would be really good if I can do that).

但我发现另一种方式来处理它在父直放站的itemcommand。首先,它会触发用户控件的按钮事件,然后转发的itemcommand。我可以承认,用户控件的事件itemcommand但我怎么传递是否成功保存的信息?有没有什么办法可以通过真/假,从用户控件的按钮事件(成功保存或不)ItemCommand事件?

But I found another way to handle it in parent repeater's itemcommand. First it will fire usercontrol's button event and then repeater's itemcommand. I can recognize that usercontrol's event in itemcommand but how do I pass whether the information saved successfully or not? Is there any way I can pass true/false(successful save or not) from usercontrol's button event to itemcommand event?

推荐答案

您可以处理你的用户控件的页面中的事件。你必须添加在 ItemCreated <处理程序/你内心的转发器的> -event。

You can handle your UserControl's event in the page. You have to add the handler in ItemCreated-event of your inner repeater.

下面是工作示例(VB.Net):

Here is a working example(VB.Net):

主页codebehind:

Main-Page codebehind:

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>

UserControl的codebehind:

The usercontrol's codebehind:

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" />

这篇关于在嵌套的中继器按钮事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆