ASP.Net:내 버튼의 클릭/명령 이벤트가 반복기에서 바인딩/실행되지 않는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/42396

문제

다음은 리피터가 있는 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을 지정하면 빌드가 ~ 할 것이다 명명된 메서드가 코드 숨김 클래스에 있는지 확인하고, 없으면 오류를 보고합니다.비록 그 메소드가 결코 호출되지 않을지라도 말이죠.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top