событие кнопки во вложенном повторителе - PullRequest
1 голос
/ 17 марта 2011

Я использую вложенный повторитель, а дочерний повторитель имеет пользовательский элемент управления.

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

UserControl сохраняет информацию в базе данных и выдает сообщение об успешном прохождении события item в виде аргумента события.

У меня есть публичное событие в usercontrol, которое будет вызвано, но я не могу связать это событие на главной странице. (было бы очень хорошо, если бы я мог это сделать).

Но я нашел другой способ справиться с этим в команде item родительского повторителя. Сначала он запускает событие кнопки usercontrol, а затем команду ретранслятора item. Я могу распознать событие usercontrol в itemcommand, но как мне передать, успешно ли сохранена информация или нет? Есть ли способ передать истину / ложь (успешное сохранение или нет) из события кнопки usercontrol в событие itemcommand?

1 Ответ

3 голосов
/ 18 марта 2011

Вы можете обработать событие вашего UserControl на странице. Вы должны добавить обработчик в ItemCreated - событие вашего внутреннего ретранслятора.

Вот рабочий пример (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" />
...