响应Repeater ItemTemplate中的Button事件

时间:2012-04-12 21:34:08

标签: asp.net asprepeater

所以我删除了数据并且只有DataBind()然后我的页面仍在吹动并刷新页面而不是编辑模式。

我想要做的是当用户点击“编辑”按钮,然后使其内联编辑转发器行。

END UPDATE

onItemCommand我添加了DataBind()

rpt.DataSource = mydatasource; 
rpt.DataBind();

在我这样做之后,我的页面不处于编辑模式,它会被吹走,每一个都被刷新 我有page_load

if (!IsPostBack) 
{
   rpt.DataSource = mydatasource; 
    rpt.DataBind();

}

结束更新

我已经多次使用中继器而没有任何问题,但这里发生了一些事情。我有一个转发器,我正在订阅itemDatabound事件,但当我点击按钮(这是我的转发器itemtemplate中的链接按钮)时,它没有转到ItemDataBound

<asp:Repeater ID="rpt" runat="server" OnItemCommand="rpt_OnItemCommand" OnItemDataBound="rpt_OnItemDataBound">
    <ItemTemplate>
        <li>
            <asp:Label ID="Label" runat="server" />
            <asp:LinkButton ID="LinkButton1" runat="server" CommandName="edit" CommandArgument='<%# Eval("MyID") %>'
                Text='<%# Eval("Title") %>' />
        </li>
    </ItemTemplate>
</asp:Repeater>


    protected void rpt_OnItemCommand(object source, RepeaterCommandEventArgs e)
          {
              if (e.CommandName == "delete")
              {
                  //Data.Contacts.RemoveAt(e.Item.ItemIndex);
              }
              else if (e.CommandName == "edit")
              {
                  EditIndex = e.Item.ItemIndex;
              }
              else if (e.CommandName == "save")
              {
                  //          
              }

           }


protected void rpt_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
      {

        if (e.Item.ItemIndex == EditIndex)
        {
          // never come to this line.... after the user click on LinkButton

        }

      }
} 

4 个答案:

答案 0 :(得分:1)

不知道这是否有帮助,但您必须调用DataBind()才能触发OnItemDataBound事件。另外我的猜测是你试图在OnItemCommand中设置EditIndex,然后使用OnDataBind事件中的值。事件按照OnItemDataBound和OnItemCommand的顺序触发,因此在那种情况下EditIndex无论如何都不正确。

将rpt.DataBind添加到OnItemCommand。当我从你的代码中尝试它时,这就行了。注意如果你没有使用它将绑定两次!IsPostBack用于原始数据绑定。

  rpt.DataSource = strings;

  if (!IsPostBack)
  {
       rpt.DataBind();
  }

 protected void rpt_OnItemCommand(object source, RepeaterCommandEventArgs e)
 {
      if (e.CommandName == "delete")
      {
          //Data.Contacts.RemoveAt(e.Item.ItemIndex);
      }
      else if (e.CommandName == "edit")
      {
          EditIndex = e.Item.ItemIndex;
      }
      else if (e.CommandName == "save")
      {
          //          
      }

     rpt.DataBind();

   }

答案 1 :(得分:0)

您必须更改rpt_OnItemCommand函数。

protected void rpt_OnItemCommand(object source, RepeaterCommandEventArgs e)
{
    if (e.CommandName == "delete")
    {
        //Data.Contacts.RemoveAt(e.Item.ItemIndex);
    }
    else if (e.CommandName == "edit")
    {
        EditIndex = e.Item.ItemIndex;
    }
    else if (e.CommandName == "save")
    {
        //          
    }
    else if (e.CommandName == "Complete")
    {
        // your function goes here
    }
}

答案 2 :(得分:0)

我有点困惑,但从上面的例子来看,你看起来已经倒退了。单击按钮将从不触发ItemDataBound事件。 ItemDataBound事件仅在每个项目绑定到转发器后调用。

按钮单击应该触发ItemCommand事件,如果没有发生,我会检查以确保您实际分配了ItemCommand处理程序,并确保命令名称是有效的。

另外,当每个回发绑定转发器时,也会发生此行为。确保在!Page.IsPostBack时绑定转发器。

答案 3 :(得分:0)

为什么您认为点击ItemDataBoundLinkButton被提出?只有在调用ItemDataBound时才会触发Repeater.DataBind()。 实际上,转发器的ItemCommand事件被提升了。