如何在按钮的OnClick事件上重新绑定ListView?

时间:2011-04-11 13:47:21

标签: c# asp.net listview

起初这看起来很简单,但我无法让它发挥作用。

我有以下情况:

        <asp:ListView ID="CommentsListView" runat="server">
            <LayoutTemplate>
                    <asp:PlaceHolder ID="itemPlaceholder" runat="server" />
            </LayoutTemplate>
            <ItemTemplate>
                <UC:Comment runat="server" CommentItem="<%# CurrentComment %>" />
                <br />
            </ItemTemplate>
        </asp:ListView>
        <asp:TextBox ID="NewComment" runat="server" />
        <asp:ImageButton ImageUrl="/images/ball.png" runat="server"
                      OnClick="SubmitComment" />

代码:

    protected void Page_Load(object sender, EventArgs e)
    {
         RenderListView();
    }

    protected void RenderListView()
    {
        CommentsListView.DataSource = //Get the data source objects
        CommentsListView.DataBind();
    }

    protected CommentObject CurrentComment
    {
        get { return (CommentObject)Page.GetDataItem(); }
    }

    protected void SubmitComment(object sender, ImageClickEventArgs e)
    {   
        //code to submit comment

        RenderListView();
    }

基本上,当我提交评论时,我想在ListView中看到它,但我没有。对于所有项目(不仅仅是新项目),“MyControl”在回发后获得空注释。

只有刷新页面后,才能看到我提交的新评论。但是我无法在每次提交时刷新页面,因为此代码位于UpdatePanel内(问题也出现在没有UpdatePanel的情况下)。

知道如何解决这个问题吗?

3 个答案:

答案 0 :(得分:0)

我找不到任何具体内容,但我预感到你的ItemTemplate中的用户控件导致了这个问题。你可以删除它,看看它是否有效吗?

答案 1 :(得分:0)

我注意到你在SubmitComment和PageLoad中都调用RenderListView,我相信当单击按钮时会激活它两次(首先激活PageLoad)。看起来您发布的代码已经简化了。是否有可能在PageLoad中发生了破坏SubmitComment步骤的事情?

答案 2 :(得分:0)

我终于解决了,如果其他人可能遇到这个 -

解决方案是避免使用“&lt;%#”而是使用ItemDataBound事件:

 <asp:ListView ID="Comments" runat="server" 
OnItemDataBound="CommentsItemDataBound">

和方法本身:

protected void CommentsItemDataBound(object sender, ListViewItemEventArgs e)
{
    var commentItem = (Comment)(((ListViewDataItem)e.Item).DataItem);

    var commentControl = (Comment)e.Item.FindControl("CommentControl");
    commentControl.CommentItem = commentItem;
}

这样,每个控件的绑定按预期工作。