pat*_*jbs 5 c# asp.net data-binding postback listview
我有一个ListView控件,它表现出奇怪的行为 - 在回发后行只是部分更新.我希望这里有人可以解释为什么会出现这种情况.
我的listview DataSource绑定到存储在页面会话状态中的项列表.这是故意的,部分是为了超时过期的视图,因为多个用户查看数据.在普通的度假村操作中,通过javascript在页面上处理排序,并且通过回调使列表/会话数据顺序保持同步.回调还会检查权限级别.在更复杂的特定度假操作上,页面上的javascript对页面进行回发以处理排序逻辑.列表/会话在回调中更新,然后列表视图控件将反弹到数据.页面再次加载,行显示新订单.没问题,对吧?
问题是列表视图中的某些元素不会根据新订单更改值.虽然在页面上处理的超链接和文本(例如像<%#Eval("ProjectAbbrev")%>)被适当更新,但是通过OnItemDataBound事件方法设置其值的复选框,文字和下拉列表不是 - 它们保持不变"冻结"到位,即使单步执行代码显示该方法在回发期间运行,并且控件应该设置为新值.如果我去手动截断列表,说原始大小的一半,确定只重新填充那些项目,但复选框等仍然保留其原始值.
所以我的问题是:为什么这些元素不会与回发中的其他listview控件元素一起更新?我觉得我要么误解了ASP.NET中的页面生命周期,要么我遇到了某种bug.
此时我认为我将不得不在javascript中将更复杂的排序操作移动到页面,但这将是相当棘手的,我想尽可能避免这样做.
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>
Run Code Online (Sandbox Code Playgroud)
代码隐藏:在回发时,执行以下代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
更新:我已经放弃了让它工作,并使用javascript将我的排序逻辑移动到客户端.如果有人对于为什么会发生这种奇怪的行为有任何想法,我仍然会非常有兴趣听到它们!
| 归档时间: |
|
| 查看次数: |
10395 次 |
| 最近记录: |