在触发ItemCommand后无法重新绑定Repeater(通过updatepanel使用asyncpostback)

时间:2011-07-14 14:21:38

标签: asp.net updatepanel repeater itemcommand

以下是该方案:

我在UpdatePanel中有一个名为updPanel的转发器。

在这个中继器里面,我有两个按钮,可以激活一个ItemCommand。

在页面加载中我有这个方法:

if (!IsPostBack)
{               
    Bind();
}

然后,在Bind():

public void Bind()
{
    rptList.DataSource = Model.GetData(Version);
    rptList.DataBind();
}

然后,在ItemCommand事件:

public void rptList_ItemCommand(object source, RepeaterCommandEventArgs e)
{
    //Some code to get info about the DataItems
    if (e.CommandName.Equals("MyCommandName1"))
    {
        //Do Stuff
    }
    else if (e.CommandName.Equals("MyCommandName2"))
    {
        //Do Other Stuff
    }
    Bind();
}

我有一个按钮(在同一个更新面板内,但在转发器之外)除了Bind()之外什么也没做。

当我单击ItemCommand时,该命令会执行,但屏幕不会更新(其中一个项目按钮应在单击后更改其图标)。如果我刷新页面,或单击“绑定”按钮,转发器将按预期显示数据。

为什么在ItemCommand之后它没有绑定?

提前致谢!

编辑:我的中继器:

<asp:Repeater ID="rptList" runat="server">
    <HeaderTemplate>
        <h3>
            <b class="rollback">Rollback</b> | <b class="emteste">Em Teste</b> | <b class="aindanaoincluido">
                            Ainda não Incluído</b> | <b class="parcialmenteok">Atividade Parcialmente OK</b>
                        | <b class="todosok">Atividade OK em Todas as Lojas</b> | <b class="publicado">Atividade
                            Publicada</b>
        </h3>
    </HeaderTemplate>
    <ItemTemplate>
        <div class="item" style="display: inline-block">
            <p style="font-size: 12px">
                <asp:ImageButton ToolTip="Marcar como Rollback" ImageUrl="/_layouts/Extensions/Versioning/img/rollback.png"
                                CommandName="MarkAsRollback" ID="btnItemRollback" CssClass="itembutton" runat="server" />
                <asp:ImageButton ToolTip="Esta atividade possui código. Clique para sinalizar como apenas procedure/config"
                                ImageUrl="/_layouts/Extensions/Versioning/img/code.png" CommandName="MarkAsProc"
                                ID="btnItemProc" CssClass="itembutton" runat="server" />
                 <asp:Image ToolTip="Esta atividade não possui scripts de banco/zips." ImageUrl="/_layouts/Extensions/Versioning/img/noscript.png"
                                runat="server" CssClass="itembutton" ID="btnItemScript" />
                 <asp:Label ID="labelWI" Text="" runat="server"></asp:Label>
                 <span style="color: #4A82CB">
                                <%# DataBinder.Eval(Container.DataItem, "SystemAssignedTo") %>
                                - </span><span style="color: Navy">
                                    <%# DataBinder.Eval(Container.DataItem, "SystemTitle") %>
                                </span>
                 <asp:HiddenField ID="workItemID" runat="server" />
              </p>
         </div>
         <hr class="item" noshade style="color: #4CBDCB; height: 2px; background-color: #4CBDCB" />
     </ItemTemplate>
</asp:Repeater>

编辑:为了简化,这是我得到的行为:

单击转发器外部的按钮:图标更改。数据库更新。

单击转发器中项目内的按钮:图标不会更改。数据库更新。

再次点击转发器中项目内的按钮:图标更改。数据库更新。但现在相应的项目是错误的,因为我已经再次更改了标志

这似乎与事情发生的顺序有关。

编辑:我忘了提及,我测试了一个完整的回发,一切正常。

2 个答案:

答案 0 :(得分:0)

问题 - 您点击商品按钮后会发生什么样的变化?您是在更新转发器中的按钮控件还是更改数据源?

我怀疑你的控制正在反弹,但你没有看到任何变化,因为你覆盖了你改变的按钮。在代码中设置一些断点或记录消息(不要在ASP.Net AJAX中使用response.write,它会破坏异步回发中的内容)并查看实际发生的情况。是否正在执行bind()方法?

答案 1 :(得分:0)

您何时加载myDataSource

如果您要在Page_Load中加载数据(在rptList_ItemCommand之前执行),那么bind()会将一组旧数据绑定到转发器。这可以解释你的第三个总结点:

  

再次点击转发器中项目内的按钮:图标发生变化。数据库更新。但是现在相应的项目是错误的,因为我已经再次更改了标志

您能否向我们提供有关数据源的详细信息以及转发器外按钮的事件处理程序?