2008-09-03 18 views
9

Dưới đây là mã từ ascx đó có lặp lại:ASP.Net: tại sao các sự kiện nhấp/lệnh của nút của tôi không bị ràng buộc/kích hoạt trong bộ lặp?

<asp:Repeater ID="ListOfEmails" runat="server" > 
    <HeaderTemplate><h3>A sub-header:</h3></HeaderTemplate> 
    <ItemTemplate> 
     [Some other stuff is here] 
     <asp:Button ID="removeEmail" runat="server" Text="X" ToolTip="remove" /> 
    </ItemTemplate> 
</asp:Repeater> 

Và trong codebehind cho các sự kiện databound và của repeater:

Protected Sub ListOfEmails_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles ListOfEmails.ItemDataBound 
    If (e.Item.ItemType = ListItemType.Item) Or (e.Item.ItemType = ListItemType.AlternatingItem) Then 
     Dim removeEmail As Button = CType(e.Item.FindControl("removeEmail"), Button) 
     removeEmail.CommandArgument = e.Item.ItemIndex.ToString() 

     AddHandler removeEmail.Click, AddressOf removeEmail_Click 
     AddHandler removeEmail.Command, AddressOf removeEmail_Command 
    End If 
End Sub 

Sub removeEmail_Click(ByVal sender As Object, ByVal e As System.EventArgs) 
    Response.Write("<h1>click</h1>") 
End Sub 

Sub removeEmail_Command(ByVal sender As Object, ByVal e As CommandEventArgs) 
    Response.Write("<h1>command</h1>") 
End Sub 

Cả nhấp chuột hoặc lệnh được nhận được gọi, là những gì tôi làm sai?

Trả lời

15

Điều khiển bên trong lồng nhau của Bộ lặp không chặn các sự kiện. Thay vào đó, bạn cần phải liên kết với sự kiện Repeater.ItemCommand.

ItemCommand chứa RepeaterCommandEventArgs trong đó có hai lĩnh vực quan trọng:

  • CommandName
  • CommandArgument

Vì vậy, một ví dụ nhỏ:

void rptr_ItemDataBound(object sender, RepeaterItemEventArgs e) 
     { 
      if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item) 
      { 
       // Stuff to databind 
       Button myButton = (Button)e.Item.FindControl("myButton"); 

       myButton.CommandName = "Add"; 
       myButton.CommandArgument = "Some Identifying Argument"; 
      } 
     } 

void rptr_ItemCommand(object source, RepeaterCommandEventArgs e) 
     { 
      if (e.CommandName == "Add") 
      { 
       // Do your event 
      } 
     } 

EDIT: Markdown hoàn toàn hosed thụt đầu dòng của tôi ồ, tôi nên dừng viết mã lần thứ là textbox anyways.

0

Dưới đây là một thí nghiệm để bạn có thể thử:

Set một breakpoint trên ListOfEmails_ItemDataBound và xem nếu nó đang được kêu gọi postbacks.

+1

tại sao? Bạn có thể xây dựng? Tôi không thực sự nghĩ rằng điều này được tính như là một 'câu trả lời' có lẽ bạn nên có thêm thay vì điều này như là một 'bình luận'. – hofnarwillie

4

Bạn cần xử lý ItemCommand event trên Bộ lặp. Đây là an example.

Sau đó, các lần nhấp vào nút của bạn sẽ được xử lý theo phương thức ListOfEmails_ItemCommand. Tôi không nghĩ rằng dây lên Click hoặc Command sự kiện (của nút) trong ItemDataBound sẽ làm việc.

0

Bạn biết điều gì đang bực bội về điều này?

Nếu bạn chỉ định OnClick trong thẻ asp: Button, xây dựng sẽ xác minh rằng phương thức được đặt tên tồn tại trong lớp codebehind và báo lỗi nếu không ... mặc dù phương pháp đó sẽ không bao giờ được gọi.

2

Nếu bạn dự định sử dụng sự kiện ItemCommand, hãy đảm bảo bạn đăng ký sự kiện ItemCommand trong Page_Init không có trong Page_Load.

protected void Page_Init(object sender, EventArgs e) 
{ 
    // rptr is your repeater's name 
    rptr.ItemCommand += new RepeaterCommandEventHandler(rptr_ItemCommand); 
} 

Tôi không chắc chắn lý do tại sao nó không được làm việc cho tôi với sự kiện này được đăng ký trong Page_Load nhưng di chuyển nó đến Page_Init giúp.