在Repeater中绑定的一个按钮控件,在Repeater的ItemDataBound事件的处理函数中为按钮的Command事件指定处理函数,但是在运行时,处理函数却无法被触发。高手看看这段代码到底错在哪里了?页面代码:
<asp:Repeater ID="rptPostil" Runat="server">
  <ItemTemplate>
    <asp:Button ID="btnTest" Runat="server" Text="测试绑定" CausesValidation="False" />
  </ItemTemplate>
</asp:Repeater>C#代码:
private void Page_Load(object sender, System.EventArgs e)
{
  if (this.rptPostil != null)
    this.rptPostil.ItemDataBound += new RepeaterItemEventHandler(OnBindPostilDefinition);
}private void OnBindPostilDefinition(object sender, RepeaterItemEventArgs e)
{
  if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
  {
    Button btn = (Button)e.Item.FindControl("btnTest");
    if (btnDel != null)
    {
      btn.CommandName = "Test";
      btn.Command += new CommandEventHandler(TestButtonCommanded);
    }
  }
}private void TestButtonCommanded(object sender, CommandEventArgs e)
{
  if (e.CommandName == "Test")
  {
    ((Label)this.FindControl("lblHeadline")).Text = "Test";
  }
}单步运行时,发现点击Test按钮后,TestButtonCommanded函数没有被调用。这段代码到底错在什么地方了?

解决方案 »

  1.   

    有个笔误,OnBindPostilDefinition函数中的
          if  (btnDel  !=  null)  
    应为
          if  (btn  !=  null)  
      

  2.   

    private void Repeater1_ItemCommand(object source, System.Web.UI.WebControls.RepeaterCommandEventArgs e)
    {
       if (e.CommandName == "Test")
       {
         ((Label)this.FindControl("lblHeadline")).Text = "Test";
       }
    }
      

  3.   

    该事件是在运行时加上的,
    private void Page_Load(object sender, System.EventArgs e)
    {
       //去掉if试试
       //if (this.rptPostil != null)
        this.rptPostil.ItemDataBound += new RepeaterItemEventHandler(OnBindPostilDefinition);
    }
    页面每次postback要重建现场
      

  4.   

    把“if (this.rptPostil != null)”删除掉。类似于很多“if(!this.isPostback)”判断也是不应该的。
      

  5.   

    <ItemTemplate>
        <asp:Button ID="btnTest" Runat="server" Text="测试绑定" CausesValidation="False" />
      </ItemTemplate>好像少了个CmmandName属性,把它设置成"edit",试试看,应该好用的
      

  6.   

    照楼上各位说的去掉if (this.rptPostil != null)还是不行,就是触发不了,把Command事件改成Click事件仍然不能触发。又把代码简化了一下,各位大大再帮忙看一下。页面部分:
    <table border="0" width="99%" cellpadding="3" cellpadding="1">
      <asp:Repeater ID="rptPostil" Runat="server">
        <ItemTemplate>
          <tr height ="25"><td>
             <asp:Button ID="btn" Runat="server" Text="Test Button Click" />
          </td></tr>
        </ItemTemplate>
    </asp:Repeater>
    </table>C#代码:
    public class skin_Test : System.Web.UI.UserControl
    {
      private Repeater rptPostil;  private void Page_Load(object sender, System.EventArgs e)
      {
        this.rptPostil = (Repeater)this.FindControl("rptPostil");
        this.rptPostil.ItemDataBound +=new RepeaterItemEventHandler(OnBindPostilDefinition);    ArrayList lst = new ArrayList();
        lst.Add(1);
        lst.Add(2);    this.BindArrayListToRepeater(lst);
      }  private void BindArrayListToRepeater(ArrayList lst)
      {
        this.rptPostil.DataSource = lst;
        this.rptPostil.DataBind();
      }  private void OnBindPostilDefinition(object sender, RepeaterItemEventArgs e)
      {
        if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
        {
          ((Button)e.Item.FindControl("btn")).Click +=new EventHandler(TestButtonClicked);
        }
      }  private void TestButtonClicked(object sender, EventArgs e)
      {
        Response.Write("Test Button Clicked!!");
      }}
      

  7.   

    又测试了一下,在把Button改成LinkButton的时候成功了,这是为什么呢?