起初这看起来很简单,但我无法让它发挥作用。
我有以下情况:
<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的情况下)。
知道如何解决这个问题吗?
答案 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;
}
这样,每个控件的绑定按预期工作。