2008-09-03 6 views
9

Вот код из ASCX, который имеет ретранслятор:ASP.Net: почему события с кнопками/командами моей кнопки не связаны/работают в репитере?

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

А в коде для ретранслятора с привязкой к данным и событий:

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 

Ни щелчок или команды вызывался, что же я делать не так?

ответ

15

Элементы управления, расположенные внутри ретрансляторов, не перехватывают события. Вместо этого вам нужно привязать к событию Repeater.ItemCommand.

ItemCommand содержит RepeaterCommandEventArgs, который имеет два важных поля:

  • CommandName
  • CommandArgument

Итак, тривиальный пример:

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 полностью обливали мой отступы , ну, я должен прекратить писать код в это текстовое поле.

0

Вот эксперимент для вас попробовать:

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

+1

Почему? Не могли бы вы уточнить? Я действительно не думаю, что это считается «ответом», возможно, вам следовало бы добавить это как «комментарий». – hofnarwillie 2012-02-22 18:28:54

4

Вам необходимо обработать ItemCommand event на вашем ретрансляторе. Вот an example.

Тогда ваши нажатия кнопок будут обрабатываться методом ListOfEmails_ItemCommand. Я не думаю, что подключение к событию Click или Command (кнопки) в ItemDataBound будет работать.

0

Вы знаете, что расстраивает об этом?

Если вы укажете OnClick в этом теге asp: Button, то построите будет убедитесь, что именованный метод существует в классе codebehind и сообщает об ошибке, если он не ... хотя этот метод никогда не будет получить вызов.

2

Если вы планируете использовать событие ItemCommand, убедитесь, что вы зарегистрировались на событие ItemCommand в Page_Init, а не в Page_Load.

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

Я не знаю, почему это не работает для меня с этим событием, зарегистрированным в Page_Load, но перенести его в Page_Init помог.