【发布时间】: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