2011-03-17 38 views
1

ネストされたリピータを使用しています。子リピータにはユーザコントロールがあります。ネストされたリピータのボタンイベント

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

UserControlは、情報をデータベースに保存し、イベントの成功を示すメッセージをイベント引数として送出します。

私はusercontrolで公開イベントを発生させていますが、そのイベントをメインページにバインドする方法はありません。 (私がそれをすることができれば本当に良いだろう)。

しかし、私は親リピータのitemコマンドでそれを処理する別の方法を見つけました。まず、usercontrolのボタンイベントを起動し、次にリピーターのitemコマンドを起動します。私はitemcommandでusercontrolのイベントを認識できますが、情報が正常に保存されたかどうかをどのように渡しますか? usercontrolのボタンイベントからitemcommandイベントにtrue/false(成功したかどうか)を渡す方法はありますか?

答えて

3

ページで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> 

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

@ user655810:これはあなたの場合です。ネストされたリピータのUsercontrolと私は信じています;)ハンドラをどこに追加しましたか?私の例のようにネストされたリピーターのItemCreatedにそれを追加しなければなりません。ItemDataBoundではなく(ItemCreatedはItemDataBoundに対してすべてのポストバックで呼び出されます)。 –

+0

恐ろしいことに、これを理解しようと莫大な時間を費やしました。ありがとう!! +1 – Brad8118

関連する問題