ASP.Net:내 버튼의 클릭/명령 이벤트가 반복기에서 바인딩/실행되지 않는 이유는 무엇입니까?
문제
다음은 리피터가 있는 ascx의 코드입니다.
<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
클릭이나 명령이 호출되지 않습니다. 제가 뭘 잘못하고 있는 걸까요?
해결책
Repeater 내부에 중첩된 컨트롤은 이벤트를 가로채지 않습니다.대신에 바인딩해야합니다 Repeater.ItemCommand
이벤트.
ItemCommand
포함 RepeaterCommandEventArgs
여기에는 두 가지 중요한 필드가 있습니다.
- 명령 이름
- 명령인수
간단한 예를 들면 다음과 같습니다.
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
}
}
다른 팁
당신은 다음을 처리해야 ItemCommand 이벤트 당신의 리피터에.여기 예.
그런 다음 버튼 클릭은 ListOfEmails_ItemCommand 메서드에 의해 처리됩니다.ItemDataBound에서 Click 또는 Command 이벤트(버튼의)를 연결하는 것이 작동하지 않을 것이라고 생각합니다.
ItemCommand 이벤트를 사용하려면 Page_Load가 아닌 Page_Init에서 ItemCommand 이벤트를 등록해야 합니다.
protected void Page_Init(object sender, EventArgs e)
{
// rptr is your repeater's name
rptr.ItemCommand += new RepeaterCommandEventHandler(rptr_ItemCommand);
}
Page_Load에 등록된 이 이벤트가 왜 작동하지 않는지 잘 모르겠지만 Page_Init로 옮기는 데 도움이 되었습니다.
시도해 볼 수 있는 실험은 다음과 같습니다.
ListOfEmails_ItemDataBound에 중단점을 설정하고 포스트백을 위해 호출되는지 확인하세요.
이것 때문에 실망스러운 것이 무엇인지 아십니까?
해당 asp:Button 태그에 OnClick을 지정하면 빌드가 ~ 할 것이다 명명된 메서드가 코드 숨김 클래스에 있는지 확인하고, 없으면 오류를 보고합니다.비록 그 메소드가 결코 호출되지 않을지라도 말이죠.