Tôi có một điều khiển ListView được trưng bày một hành vi kỳ lạ - các hàng chỉ cập nhật một phần sau khi postback. Tôi hy vọng một ai đó ở đây có thể làm sáng tỏ một số lý do tại sao điều này có thể xảy ra.Listview không hoàn toàn cập nhật trên databind() sau khi postback
Chế độ xem danh sách của tôi DataSource bị ràng buộc vào Danh sách các mục được lưu trữ trong trạng thái phiên trang. Đây là chế độ xem có chủ ý, một phần để hết thời gian chờ vì nhiều người dùng xem dữ liệu. Trên một hoạt động khu nghỉ mát đơn giản, việc phân loại được xử lý trên trang thông qua javascript, và thứ tự dữ liệu danh sách/phiên được giữ đồng bộ thông qua callbacks. Gọi lại cũng kiểm tra các cấp quyền. Trên một hoạt động nghỉ mát cụ thể phức tạp hơn, javascript trên trang tạo một postback cho trang để xử lý logic sắp xếp. Danh sách/Phiên được cập nhật như trong cuộc gọi lại, sau đó kiểm soát listview được phục hồi dữ liệu. Trang tải lại và các hàng hiển thị thứ tự mới. Không sao, phải không?
Vấn đề là một số các yếu tố trong chế độ xem danh sách không thay đổi giá trị theo thứ tự mới. Trong khi các siêu liên kết và văn bản được xử lý trên trang (ví dụ như <% # Eval ("ProjectAbbrev")%>) được cập nhật một cách thích hợp, hộp kiểm, chữ, và trình đơn thả xuống có giá trị được đặt thông qua phương thức sự kiện OnItemDataBound thì không - chúng ở lại "đông lạnh" tại chỗ, mặc dù bước qua mã cho thấy rằng phương thức được chạy trong thời gian postback, và rằng các điều khiển NÊN được đặt thành giá trị mới của chúng. Nếu tôi đi và cắt theo cách thủ công danh sách để nói, một nửa kích thước ban đầu, hãy đảm bảo chỉ đủ các mục đó được điền lại, nhưng các hộp kiểm và vẫn giữ nguyên giá trị ban đầu của chúng.
Vì vậy, câu hỏi của tôi là: Tại sao những yếu tố này không được cập nhật cùng với phần còn lại của các yếu tố kiểm soát chế độ xem danh sách trên bài đăng? Tôi có cảm giác rằng tôi hoặc là hiểu lầm vòng đời trang trong ASP.NET hoặc tôi đã gặp phải một lỗi của một số loại.
Tại thời điểm này, tôi nghĩ rằng tôi sẽ phải di chuyển hoạt động phân loại phức tạp hơn đến trang trong javascript, nhưng điều đó sẽ khá phức tạp và tôi muốn tránh làm như vậy nếu có thể.
CẬP NHẬT: Tôi đã thử đặt EnableViewState thành false và không sửa lỗi này. Tôi không thể sử dụng chiến thuật đó trong bất kỳ trường hợp nào vì các phần khác của trang (lưu) dựa vào việc đọc các viewstate cuối cùng.
UPDATE: Tôi đang cung cấp một số đoạn mã trong hy vọng rằng họ có thể làm sáng tỏ về vấn đề này:
Page: Yếu tố HyperLink sẽ cập nhật đúng cách sau khi postback, nhưng CheckBox trong đó có giá trị của nó được gán trong Phương thức OnQueueRepeater_ItemDataBound sẽ vẫn giữ nguyên.
<%@ 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>
Mã đằng sau: Trên postback, đoạn mã sau thực hiện:
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;
}
UPDATE: Tôi đã từ bỏ vào việc này để làm việc và di chuyển Logic sắp xếp của tôi vào phía khách hàng với javascript. Nếu bất cứ ai có bất kỳ ý tưởng nào về lý do tại sao hành vi kỳ quặc này lại xảy ra, tôi vẫn rất muốn nghe chúng!
Cảm ơn tim! Tôi đã di chuyển khá nhiều từ điều này, nhưng nếu tôi gặp phải vấn đề này một lần nữa, tôi sẽ chắc chắn để cho rằng một shot. – patjbs
Tim là đúng - Tôi đã có cùng một vấn đề chính xác và Page_PreRender hoạt động trên postbacks :) – Jason