2011-03-17 32 views
1

我正在使用嵌套中繼器,子中繼器中有一個用戶控件。嵌套中繼器中的按鈕事件

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

UserControl將信息保存在數據庫中,並將項目保存的事件傳遞成功消息作爲事件參數引發。

我確實在用戶控件中有公共事件會被提出,但是我無法在主頁面中綁定該事件。 (如果我能做到這一點,這將是非常好的)。

但我發現了另一種方法來處理它在父轉發器的itemcommand。首先它會觸發usercontrol的按鈕事件,然後是中繼器的itemcommand。我可以在itemcommand中識別usercontrol的事件,但如何通過信息保存是否成功?有沒有什麼辦法可以從usercontrol的按鈕事件傳遞true/false(成功保存或沒有)到itemcommand事件?

回答

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> 

用戶控件的代碼隱藏:

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 2011-03-18 16:03:55

+1

@ user655810:但這正是你的情況。一個嵌套的中繼器中的用戶控件,相信我,它的工作原理;)你在哪裏添加處理程序?您必須將其添加到嵌套中繼器的ItemCreated中(如我的示例中所示),而不是ItemDataBound(每次回發時針對ItemDataBound調用ItemCreated)。 – 2011-03-18 16:23:58

+0

真棒花了大量的時間試圖弄清楚這一點。謝謝!! +1 – Brad8118 2011-04-06 21:33:59