【问题标题】:Listview not fully updating on databind() after postback回发后 Listview 未在 databind() 上完全更新
【发布时间】:2023-04-07 17:02:01
【问题描述】:

我有一个 ListView 控件,它表现出奇怪的行为 - 回发后行仅部分更新。我希望这里有人可以解释为什么会发生这种情况。

我的 listview 数据源绑定到存储在页面会话状态中的项目列表。这是故意的,部分是为了使过期视图超时,因为多个用户查看数据。在普通的度假村操作中,排序是通过 javascript 在页面上处理的,并且列表/会话数据顺序通过回调保持同步。回调还检查权限级别。在更复杂的特定度假村操作上,页面上的 javascript 会回发到页面以处理排序逻辑。 List/Session 在回调中更新,然后将 listview 控件重新绑定到数据。页面再次加载,行显示新顺序。没问题吧?

问题是列表视图中的 一些 元素没有按照新的顺序改变值。虽然在页面上处理的超链接和文本(例如 )已适当更新,但通过 OnItemDataBound 事件方法设置其值的复选框、文字和下拉列表不会 - 它们保持不变“冻结”到位,即使单步执行代码显示该方法在回发期间运行,并且控件应该设置为它们的新值。如果我去手动截断列表说,原始大小的一半,肯定只有这些项目被重新填充,但复选框等仍然保留它们的原始值。

所以我的问题是:为什么这些元素不与回发中的其余列表视图控件元素一起更新?我觉得我要么误解了 ASP.NET 中的页面生命周期,要么遇到了某种错误。

在这一点上,我想我必须将更复杂的排序操作移到 javascript 中的页面上,但这会相当棘手,如果可能的话,我想避免这样做。


更新:我尝试将 EnableViewState 设置为 false,但它不能解决此问题。在任何情况下我都不能使用这种策略,因为页面的其他部分(保存)最终依赖于读取视图状态。
更新:我提供了一些代码 sn-ps,希望他们能对这个问题有所了解:

Page:HyperLink 元素在回发后会正确更新,但在 OnQueueRepeater_ItemDataBound 方法中分配了其值的 CheckBox 将保持不变。

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TextProcessorProjects.ascx.cs" Inherits="ETD.UI.Controls.TextProcessorProjects" %>

<asp:ListView ID="QueueListView" runat="server" OnItemDataBound="OnQueueRepeater_ItemDataBound">
 <ItemTemplate>
  <tr>
   <td><asp:HyperLink runat="server" ID="ProjectIDLink"><%# Eval("ProjectAbbrev") %></asp:HyperLink></td>
   <td><asp:CheckBox runat="server" ID="ScannedCheckBox" BorderStyle="None" /></td>
  </tr>
 </ItemTemplate>
</asp:ListView>

代码隐藏:在回发时,执行以下代码:

protected List<Book> QueueDataItems
{
 get { return (List<Book>)Session["Queue"]; }
 set { Session["Queue"] = value; }
}

else if (IsPostBack && !Page.IsCallback)
{
 // resort QueueDataItems List appropriately
 ResortQueue(Request.Params) 
 // rebind
 QueueListView.DataSource = QueueDataItems;
 QueueListView.DataBind();
}

protected void OnQueueRepeater_ItemDataBound(object sender, ListViewItemEventArgs e)
{
 // ...
 // ... other controls set
 CheckBox scannedCheckBox = e.Item.FindControl("ScannedCheckBox") as CheckBox;
 scannedCheckBox.Checked = book.Scanned;
}

更新:我已经放弃了让它工作并使用 javascript 将我的排序逻辑移动到客户端。如果有人对为什么会发生这种奇怪行为有任何想法,我仍然很想听听他们的意见!

【问题讨论】:

    标签: c# asp.net data-binding listview postback


    【解决方案1】:

    出于兴趣,您在页面上的哪个点进行数据绑定?页面加载?

    在 OnPreRender 上试试 - 可能会有所帮助。

    【讨论】:

    • 谢谢蒂姆!我已经从这个问题上继续前进了,但如果我再次遇到这个问题,我一定会试一试。
    • Tim 是对的 - 我遇到了完全相同的问题,并且 Page_PreRender 在回发上工作 :)
    • 为我工作!非常感谢。
    【解决方案2】:

    听起来 ViewState 正在启动并重新填充数据。 在任何情况下,如果您在每个回发中都进行数据绑定,您应该将 ListView 的 EnableViewState 设置为 false 以减小页面大小。

    【讨论】:

    • 很遗憾,禁用视图状态并不能解决问题。
    【解决方案3】:

    我认为这与页面生命周期中触发不同事件的顺序有关。见ASP.NET Page Life Cycle Overview。您应该在 Page_OnPreRender 中进行数据绑定,以确保在页面上的控件事件(这将导致数据更新)之后完成重新填充。

    【讨论】:

    • 这个。 FFS,当你再次调用 DataBind 时,它肯定应该使 ControlState 无效?
    【解决方案4】:

    也许您的 QueueListView 出于某种原因正在重新绑定。

    尝试在 DataBind() 之后重置 DataSource 值,看看会发生什么

    QueueListView.DataBind();
    QueueListView.DataSource = null;
    

    【讨论】:

      【解决方案5】:

      这可能是缓存问题吗?我在使用带有 XMLDatasource 的列表视图时遇到了类似的问题。我尝试关闭所有视图状态。我将在后面的代码中绑定列表视图,并使用 XPath 将其全部写到我的 aspx 页面上的屏幕上。这是在搜索中使用的......下次我进行搜索时,没有出现任何新信息。原因是 XMLDatasource 默认启用了缓存。就我而言,我每次都在访问数据库,并且不需要缓存它。我关闭了数据源上的缓存,我的所有问题都得到了解决。

      我之所以提到这一点,是因为我遇到的错误听起来与您的相同。我看不出您是如何在 itemdatabound 中检索书籍的——而且从外观上看,您并没有使用 XML 数据源……但我认为该评论可能会为您触发一些事情。祝你好运......虽然听起来你已经继续前进了:-)。

      【讨论】:

        【解决方案6】:

        复选框控件是 ReadOnly=true 还是 Enabled=false?

        无论我如何尝试在后面的代码中处理控件,我都遇到了具有上述设置的这些属性之一的控件无法更新的问题。我认为禁用视图状态也会绕过 ASP.NET 的那个小“功能”,但值得一试。

        另外,如果项目是通过客户端代码排序的,那么回发中是否保留了该排序?我不认为您可以通过 javascript 更改会话中的 CLR 对象。

        【讨论】:

        • 未设置为只读,启用复选框的用户和未启用复选框的用户都会出现问题。有趣的想法虽然我可能会看。至于客户端排序,执行一个手段会触发一个回调函数,使服务器会话数据与客户端看到的内容保持同步。
        【解决方案7】:

        不确定这是否有帮助,请将 替换为在 OnQueueRepeater_ItemDataBound 方法中分配的 Hyperlink.Text 并查看是否所有行都正确填充。

        这可能无法解决您的问题,但知道结果会很有趣。

        【讨论】:

        • 该字段实际上在上面显示的代码中正确呈现。是复选框和下拉菜单(未显示)未能与显示的其余部分一起正确地重新绘制/重绘。
        • 是的,我明白你的意思。顺便说一句,在您的代码中没有看到任何下拉菜单,数据绑定是如何完成的?尝试在没有控件的情况下只为复选框和下拉菜单呈现文本/标签。查看值是否被渲染。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-26
        • 1970-01-01
        • 2019-10-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多