2008-09-03 1 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イベントにバインドする必要があります。

  • の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を完全にまずい私のインデント

ItemCommandは、2つの重要なフィールドを持つRepeaterCommandEventArgsが含まれています、ああ、私はコードを書くのをやめてとにかくテキストボックスです。

0

は、あなたがしようとするための実験です:

はListOfEmails_ItemDataBoundにブレークポイントを設定し、それがポストバックのために呼び出されていますかどうかを確認します。

+1

なぜですか?あなたは詳しく説明できますか?私は本当にこれが「答え」として数えているとは思わないかもしれないが、むしろこれを「コメント」として追加したほうがよいだろう。 – hofnarwillie

4

リピータでItemCommand eventを処理する必要があります。ここにはan exampleがあります。

次に、ボタンのクリックはListOfEmails_ItemCommandメソッドで処理されます。私は、ItemDataBound内の(ボタンの)ClickイベントまたはCommandイベントを配線することはできないと思います。

0

あなたはこれについて不快なことを知っていますか?

asp:ButtonタグにOnClickを指定すると、という名前のメソッドがコードビハインドクラスに存在することを確認し、そうでない場合はエラーを報告します。呼び出されます。

2

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に移動されなかった理由を確認していません。

関連する問題