【问题标题】:Respond to Button Events inside Repeater ItemTemplate响应Repeater ItemTemplate 中的按钮事件
【发布时间】:2012-04-12 21:34:08
【问题描述】:

所以我已经删除了 datasouce 并且只有 DataBind() 然后我的页面仍然在刷新页面,而不是处于 EDIT 模式。

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

结束更新

onItemCommand 我已经添加了 DataBind()

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

在我这样做之后,我的页面没有处于编辑模式并且它被吹走并且所有内容都被刷新了 我有 page_load

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

}

结束更新

我已经多次使用中继器没有问题,但这里发生了一些事情。我有一个转发器,我正在订阅 itemDatabound 事件,但是当我单击按钮(这是我的转发器项目模板中的一个链接按钮)时,它不会转到 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

        }

      }
} 

【问题讨论】:

    标签: asp.net asprepeater


    【解决方案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();
    
       }
    

    【讨论】:

    • 我认为你是正确的,但是当我有 databind() 时,我的页面刷新并且我退出了 repter 的编辑模式.. 有什么想法吗?
    • 不要再做 rpt.DataSource 了。只是 DataBind();仍然在 Page_Load 中设置源,但不要在 rpt_OnItemCommand 中再次设置它。只需调用 DataBind() 方法即可。
    • 抱歉,这可能对您不起作用,但我将 DataSource 方法从 !IsPostBack 中取出,然后如果我单击编辑,它就会命中。 (更新答案)
    • 这篇文章应该完全符合您的要求:codeproject.com/Articles/247289/…
    【解决方案2】:

    您必须更改您的 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
        }
    }
    

    【讨论】:

    • 如何解决问题?看起来您刚刚添加了一个额外的 else if 条件...
    • 当您单击中继器内的 LinkBut​​ton 时,它会触发 rpt_OnItemCommand 函数,而不是 rpt_OnItemDataBound。您已经在 rpt_OnItemDataBound 函数中编写了代码,但我是在 rpt_OnItemCommand 函数中编写的。
    • 我想知道你为什么要在 OnItemDataBound 函数中运行你的代码。我认为在 OnItemCommand 函数中会容易得多。
    【解决方案3】:

    为什么您认为单击LinkButton 时会出现ItemDataBoundItemDataBound 仅在调用 Repeater.DataBind() 时被触发。 实际上,转发器的 ItemCommand 事件被引发了。

    【讨论】:

      【解决方案4】:

      我有点困惑,但从上面的例子看,你好像把它弄反了。单击按钮将触发ItemDataBound 事件。 ItemDataBound 事件仅在每个项目绑定到中继器后调用。

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

      附带说明,当转发器在每次回发时都绑定时,也会发生这种行为。确保在!Page.IsPostBack 时绑定中继器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-16
        • 2012-02-03
        • 1970-01-01
        相关资源
        最近更新 更多