2011-03-17 3 views
1

중첩 된 중계기를 사용 중이며 하위 중계기에 사용자 컨트롤이 있습니다.중첩 된 중계기에서 버튼 이벤트

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

UserControl은 정보를 데이터베이스에 저장하고 items argued 이벤트 전달 성공 메시지를 이벤트 args로 발생시킵니다.

발생하는 usercontrol에 공개 이벤트가 있지만 기본 페이지에서 해당 이벤트를 바인딩 할 수있는 방법이 없습니다. (내가 그렇게 할 수 있다면 정말 좋을 것이다).

그러나 부모 리피터의 itemcommand에서 처리하는 다른 방법을 찾았습니다. 먼저 usercontrol의 버튼 이벤트를 발생시킨 다음 리피터의 itemcommand를 발생시킵니다. itemcontrol에서 usercontrol의 이벤트를 인식 할 수 있지만 정보가 성공적으로 저장되었는지 여부는 어떻게 전달합니까? 내가 true/false (성공적인 저장 여부) usercontrol의 단추 이벤트에서 itemcommand 이벤트 전달할 수있는 방법이 있습니까?

답변

3

페이지에서 UserControl의 이벤트를 처리 할 수 ​​있습니다. 내부 중계기의 경우 ItemCreated에 처리기를 추가해야합니다.

메인 페이지의 코드 숨김 :

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 

영문 :

<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의 코드 숨김 :

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 
다음

는 작업 예 (VB.Net)입니다

및 그 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). 중첩 된 repeater 내부의 AddHandler가 작동하지 않는다고 생각합니다. – user655810

+1

@ user655810 :하지만 이것은 정확하게 당신의 경우입니다. 중첩 된 중계기에서 Usercontrol 및 날 믿어, 그것은 작동;) 어디 처리기를 추가 했습니까? 제 예제와 같이 중첩 된 repeater의 ItemCreated에 ItemDataBound에 추가해야합니다 (ItemDataBound에 대해 모든 다시 게시에서 ItemCreated가 호출됩니다). –

+0

엄청난 시간을 엄청난 시간 동안 보냈습니다. 감사!! +1 – Brad8118