2009-05-04 4 views
5

홀수 동작을 보이는 ListView 컨트롤이 있습니다. 행은 포스트 백 이후에만 부분적으로 업데이트됩니다. 나는 여기 누군가가 왜 이런 일이 일어날 지에 관해 밝혀 줄 수 있기를 바라고 있습니다.Listview가 포스트 백 이후에 databind()에서 완전히 업데이트되지 않음

내 listview 데이터 소스는 페이지 세션 상태에 저장된 항목 목록에 바인딩됩니다. 이것은 의도적으로, 여러 사용자가 데이터를 보았으므로 부분적으로 만료 된 오래된보기를 부분적으로 초과합니다. 일반 리조트 작업에서는 정렬이 자바 스크립트를 통해 페이지에서 처리되고 목록/세션 데이터 순서가 콜백을 통해 동기화 상태로 유지됩니다. 콜백은 권한 수준도 검사합니다. 더 복잡한 특정 리조트 작업에서 페이지의 javascript는 정렬 논리를 처리하기 위해 페이지에 다시 게시를 만듭니다. 목록/세션은 콜백 에서처럼 업데이트되고 목록 뷰 컨트롤은 데이터에 리바운드됩니다. 페이지가 다시로드되고 행에 새 주문이 표시됩니다. 문제 없지, 그렇지?

문제리스트 뷰 내의 요소 일부 새로운 주문에 따라 값이 변화하지 않는다는 것이다. 페이지에서 처리되는 하이퍼 링크와 텍스트 (예 : < % # Eval ("ProjectAbbrev") %>)는 적절하게 업데이트되지만 OnItemDataBound 이벤트 메서드를 통해 값을 설정 한 확인란, 리터럴 및 드롭 다운은 그대로 유지됩니다 코드를 단계별로 실행하면 다시 게시하는 동안 메서드가 실행되고 컨트롤이 새 값으로 설정되어야 함을 나타냅니다. 가서 목록을 수동으로 잘라내어 원래 크기의 절반 정도만 채우면 해당 항목 만 다시 채워지지만 체크 상자 등은 여전히 ​​원래 값을 유지합니다.

내 질문은 : 왜 이러한 요소를 포스트 백의 나머지 목록보기 컨트롤 요소와 함께 업데이트하지 않는 것입니까? ASP.NET에서 페이지 라이프 사이클을 오해하고 있거나 일부 버그가 발생했다고 생각합니다.

이 시점에서 나는 더 복잡한 정렬 작업을 자바 스크립트의 페이지로 옮겨야한다고 생각하지만, 다소 까다롭기 때문에 가능한 경우 그렇게하지 않는 것이 좋습니다.


업데이트 : EnableViewState를 false로 설정하려고 시도했지만 수정하지 않았습니다. 페이지의 다른 부분 (저장)이 결국 viewstate 읽기에 의존하기 때문에 어떤 경우에도 해당 전략을 사용할 수 없습니다.
UPDATE :

페이지 : : 나는 그들이이 문제에 도움이 되거 수 있다는 희망에 일부 코드 조각을 제공하고있어 하이퍼 링크 요소가 다시 게시 후 제대로 업데이트됩니다, 그러나 그것의 값을 갖는 CheckBox의는 할당 OnQueueRepeater_ItemDataBound 메서드는 그대로 유지됩니다.

<%@ 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; 
} 

업데이트를 : 나는 일이 점점 포기와 자바 스크립트와 클라이언트 측에 내 정렬 논리를 이동했습니다. 누군가이 이상한 행동이 왜 일어나고 있는지에 대한 아이디어가 있다면, 나는 여전히 그들을 듣고 싶어합니다!

답변

6

관심이 있으신 분은 페이지의 어떤 지점에서 데이터 바인딩을 사용하십니까? Page_Load?

OnPreRender에서 시도해보십시오. 도움을 받으실 수 있습니다.

+0

감사합니다! 나는이 문제에 대해 거의 전진 해왔다. 그러나이 문제에 다시 들어가면 나는 그 사실을 분명히 알 것이다. – patjbs

+0

팀이 맞습니다. 정확한 문제가 있었고 Page_PreRender가 포스트 백에서 작동합니다. – Jason

1

ViewState와 같은 소리가 발생하여 데이터가 다시 채워집니다. 어쨌든 모든 포스트 백에서 데이터 바인딩을하는 경우에는 ListView의 EnableViewState를 false로 설정하여 페이지 크기를 줄여야합니다.

+0

viewstate를 사용하지 않으면 문제가 해결되지 않습니다. – patjbs

0

아마도 어떤 이유에서든 QueueListView가 다시 바인딩 될 수 있습니다.

이는 캐싱 문제가 될 수

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

생각에 감사하지만 불행히도 운이 없음 – patjbs

0

모든 기회를 어떻게되는지 확인하기 위해 데이터 바인딩() 후 데이터 소스 값을 다시 설정해보십시오? XMLDatasource를 사용하여 listview를 사용하여 비슷한 문제가 발생했습니다. 나는 모든 viewstate를 끄는 것을 시도했다. 코드에서 listview를 바인딩하고 XPath를 사용하여 aspx 페이지의 화면에 모두 표시합니다. 이것은 검색에 사용되었습니다 .... 다음에 검색을 수행 할 때 새로운 정보가 전혀 나타나지 않았습니다. 그 이유는 XMLDatasource가 기본적으로 캐싱을 사용할 수 있기 때문입니다. 제 경우에는 매회 DB를 치고 있었고 캐시 할 필요가 없었습니다. 데이터 소스에서 캐싱을 해제하고 모든 문제가 수정되었습니다.

나는 당신의 것과 똑같은 소리를 내고 있었기 때문에 나는 이것을 언급한다. itemdatabound에서 책을 어떻게 가져 왔는지는 알 수 없습니다. XML 데이터 소스를 사용하여 보이지는 않지만 .....이 주석이 당신을 위해 뭔가를 유발할 수 있다고 생각했습니다. 행운을 빌어 요 .... 당신이 이미 옮긴 것처럼 들리지만 :-).

0

확인란 컨트롤이 ReadOnly = true 또는 Enabled = false입니까?

위의 코드 중 하나에서 컨트롤을 manhandle 처리하려고해도 위와 같이 설정된 컨트롤 중 하나를 사용하여 컨트롤에 문제가 있습니다. viewstate를 비활성화하면 ASP.NET의 "기능"을 우회 할 수 있다고 생각하지만, 한 번해볼 가치가 있습니다.

또한 항목이 clientside 코드를 통해 정렬 된 경우 해당 순서가 포스트 백에 유지됩니까? 나는 당신이 자바 스크립트를 통해 세션에있는 CLR 객체를 변경할 수 있다고 생각하지 않는다.

+0

읽기 전용으로 설정되지 않았으며 확인란이 활성화 된 사용자와 그렇지 않은 사용자 모두에게 문제가 발생합니다. 내가 볼 수도있는 흥미로운 아이디어. 클라이언트 측 정렬의 경우, 리조트를 수행하면 클라이언트가보고있는 것과 서버 세션 데이터를 최신 상태로 유지하는 콜백 함수가 실행됩니다. – patjbs

0

확실하지 않은 경우 OnQueueRepeater_ItemDataBound 메서드에 할당 된 Hyperlink.Text와 < % # Eval ("ProjectAbbrev") %>를 바꾸고 모든 행이 올바르게 채워지는지 확인하십시오.

아마도이 방법으로 문제가 해결되지는 않지만 그 결과를 아는 것은 흥미로울 것입니다.

+0

그 필드는 실제로 위에 표시된 코드에서 올바르게 렌더링되었습니다. 체크 박스와 드롭 다운 (표시되지 않음)은 디스플레이의 나머지 부분과 함께 적절히 휴양/다시 그리기에 실패했습니다. – patjbs

+0

네가 의미하는 바를 알아 냈어. Btw, 귀하의 코드에서 드롭 다운을 보지 못했지만, 어떻게 데이터 바인딩이 완료 되었습니까? 컨트롤없이 체크 상자와 드롭 다운의 텍스트/레이블 만 렌더링하십시오. 값이 렌더링되는지 확인하십시오. –

2

이것은 페이지 라이프 사이클 동안 다른 이벤트가 트리거되는 순서와 관련이 있다고 생각합니다. ASP.NET Page Life Cycle Overview을 참조하십시오. Page_OnPreRender에서 데이터 바인딩을 수행하여 페이지에서 컨트롤 이벤트 (데이터 업데이트를 유발할 것임) 이후에 복제 작업이 완료되었는지 확인해야합니다.

+0

이것은.FFS, 확실히 DataBind를 다시 호출하면 ControlState가 무효화되어야합니까? –

관련 문제