2011-03-17 4 views
1

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

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

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

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

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

ответ

3

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

Вот рабочий пример (VB.Net):

Main-страница отделенного кода:

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> 

отделенного кода The UserControl в:

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

Я уже пробовал это, но это не был метод запуска, подписанный на событие (в вашем случае DepartmentSaved). Я думаю, что AddHandler внутри вложенного репитера не работает. – user655810

+1

@ пользователь655810: но это точно ваш случай. Usercontrol во вложенном ретрансляторе и поверьте мне, он работает;) Где вы добавили обработчик? Вы должны добавить его в ItemCreated из вложенного ретранслятора, как в моем примере, а не в ItemDataBound (ItemCreated вызывается для каждой обратной передачи по сравнению с ItemDataBound). –

+0

Awesome потратил огромное количество времени, пытаясь понять это. Благодаря!! +1 – Brad8118

Смежные вопросы