2009-05-04 21 views
5

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!

Trả lời

6

không quan tâm, điểm nào trên trang bạn đang kết nối dữ liệu? Page_Load?

Dùng thử trên OnPreRender - có thể trợ giúp.

+0

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

+0

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

1

Âm thanh như ViewState đang khởi động và tái tạo dữ liệu. Trong mọi trường hợp, nếu bạn đang Databinding trong mọi anyways postback, bạn có lẽ nên đặt EnableViewState của ListView của bạn thành false để giảm kích thước trang.

+0

vô hiệu hóa chế độ xem không giải quyết được sự cố. – patjbs

0

Có thể QueueListView của bạn đang bị ràng buộc lại vì một lý do nào đó.

Thử đặt giá trị DataSource sau DataBind() để xem những gì sẽ xảy ra

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

cảm ơn cho suy nghĩ nhưng tiếc là không có may mắn có – patjbs

0

Bất kỳ cơ hội này có thể là một vấn đề bộ nhớ đệm? Tôi chạy vào một vấn đề tương tự bằng cách sử dụng một listview với một XMLDatasource. Tôi đã cố gắng tắt tất cả các viewstate. Tôi sẽ ràng buộc listview trong mã phía sau và sử dụng XPath để viết tất cả ra màn hình trên trang aspx của tôi. Điều này đã được sử dụng trong tìm kiếm .... lần sau tôi tìm kiếm, không có thông tin mới nào xuất hiện. Lý do là vì một XMLDatasource có bộ nhớ đệm được kích hoạt theo mặc định. Trong trường hợp của tôi, tôi đã đánh DB mỗi lần và không cần phải cache nó. Tôi đã tắt bộ nhớ đệm trên nguồn dữ liệu và tất cả các sự cố của tôi đã được khắc phục.

Tôi chỉ đề cập đến điều này vì lỗi tôi đã có âm thanh giống với âm thanh của bạn. Tôi không thể nhìn thấy cách bạn đang lấy cuốn sách trong itemdatabound - và bạn không sử dụng một XML Datasource bởi ngoại hình của những thứ ..... nhưng tôi nghĩ rằng bình luận có thể kích hoạt một cái gì đó cho bạn. Chúc may mắn .... mặc dù nó có vẻ như bạn đã di chuyển trên :-).

0

Kiểm soát hộp kiểm có ReadOnly = true hoặc Enabled = false?

Tôi gặp sự cố với các điều khiển với một trong các thuộc tính này được đặt ở trên không cập nhật cho dù tôi cố gắng kiểm soát phần mã phía sau như thế nào. Tôi nghĩ rằng việc vô hiệu hóa các ViewState cũng sẽ bỏ qua ít tính năng "" của ASP.NET, nhưng nó có giá trị một shot.

Ngoài ra, nếu các mục được sắp xếp qua mã khách hàng, thứ tự đó có được lưu giữ trên postback không? Tôi không nghĩ rằng bạn có thể thay đổi đối tượng CLR bạn có trong phiên thông qua javascript.

+0

Không được thiết lập để chỉ đọc, và vấn đề xảy ra cả cho người dùng cho người mà các hộp kiểm được kích hoạt, và những người mà họ không phải là. Ý tưởng thú vị mặc dù tôi có thể nhìn vào. Đối với việc phân loại phía máy khách, việc thực hiện một khu nghỉ mát sẽ kích hoạt chức năng gọi lại để giữ cho dữ liệu phiên máy chủ được cập nhật với những gì khách hàng đang nhìn thấy. – patjbs

0

Không chắc chắn nếu điều này giúp, thay thế <% # Eval ("ProjectAbbrev")%> với siêu kết nối.Tiếp theo được gán trong phương thức OnQueueRepeater_ItemDataBound và xem tất cả các hàng có được điền chính xác hay không.

Điều này có thể sẽ không giải quyết được vấn đề của bạn, nhưng sẽ rất thú vị khi biết kết quả.

+0

Trường đó đã thực sự hiển thị chính xác trong mã được hiển thị ở trên. Đó là các hộp kiểm và danh sách thả xuống (không được hiển thị) không thể sử dụng/vẽ lại cùng với phần còn lại của màn hình. – patjbs

+0

Tôi đã hiểu ý của bạn. Btw, không thấy bất kỳ dropdowns trong mã của bạn, làm thế nào là databinding thực hiện? Thử chỉ hiển thị văn bản/nhãn cho các hộp kiểm và menu thả xuống mà không có các điều khiển. Xem liệu các giá trị có được hiển thị hay không. –

2

Tôi nghĩ rằng điều này liên quan đến thứ tự khi các sự kiện khác nhau được kích hoạt trong vòng đời của trang. Xem ASP.NET Page Life Cycle Overview. Bạn nên làm databinding trong Page_OnPreRender để đảm bảo replopulating được thực hiện sau khi sự kiện kiểm soát (điều đó sẽ gây ra cập nhật dữ liệu) trên trang.

+0

Điều này.FFS, chắc chắn khi bạn gọi DataBind một lần nữa, nó sẽ làm mất hiệu lực ControlState? –

Các vấn đề liên quan