2010-05-13 2 views
8

데이터 바인딩 된 표 (객체 소스에 바인딩 된)가있는 간단한 ASP 페이지가 있습니다. 표는 마법사의 페이지 내에 있으며 각 행에 대해 '선택'확인란이 있습니다. 마법사의 한 단계에서GridView는 포스트 백 간의 상태를 기억하지 않습니다.

, 나는의 GridView 바인딩 :

protected void Wizard1_NextButtonClick(object sender, WizardNavigationEventArgs e) 
    { 
... 
     // Bind and display matches 
     GridViewMatches.EnableViewState = true; 
     GridViewMatches.DataSource = getEmailRecipients(); 
     GridViewMatches.DataBind(); 

을 그리고 마침 버튼을 클릭하면, 나는 행을 반복하고 선택 있는지 확인하십시오

protected void Wizard1_FinishButtonClick(object sender, WizardNavigationEventArgs e) 
{ 
    // Set the selected values, depending on the checkboxes on the grid. 
    foreach (GridViewRow gr in GridViewMatches.Rows) 
    { 
     Int32 personID = Convert.ToInt32(gr.Cells[0].Text); 
     CheckBox selected = (CheckBox) gr.Cells[1].FindControl("CheckBoxSelectedToSend"); 

그러나시를 이 단계 GridViewMatches.Rows.Count = 0! 나는 그리드를 다시 묶지 않아도 돼, 그렇지 않아? 뷰 스테이트가 국가를 유지할 것으로 기대합니다. (또한 격자를 다시 바인딩하면 선택 확인란이 지워집니다.)

NB : 또한이 페이지는 OnInit 메서드에서 사용자 정의 컨트롤을 동적으로 추가합니다. 뷰 상태가 엉망이 될 수도 있다고 들었지만 올바르게 말할 수는 있지만 추가 된 컨트롤에 대한 viewstate는 작동하는 것으로 보입니다 (값은 포스트 백간에 유지됩니다)

감사합니다. 어떤 도움을 위해 사전에!

라이언

UPDATE :이 내가 프로그래밍 방식으로 데이터 소스를 설정하고있는 사실과 함께 할 수 있을까? ASP 엔진이 아직 정의되지 않은 데이터 소스로 페이지 수명주기 동안 그리드를 데이터 바인딩하는지 궁금해했습니다. (테스트 페이지에서 GridView는 '자동으로 데이터 바인딩 됨'입니다. 그리드를 다시 바인딩하지 않으려 고합니다. 이전 게시물의 viewstate 값만 원합니다!

ASP 헤더 : ViewStateEncryptionMode = "결코"이 - 다음과 같이이 가끔 '잘못된 viewstate가 검증 MAC'메시지 참고로

를 해결하는 것이 었습니다, 내의 GridView 정의됩니다

<asp:GridView ID="GridViewMatches" runat="server" AllowSorting="True" AutoGenerateColumns="False" 
    BackColor="White" BorderColor="#E7E7FF" BorderStyle="None" BorderWidth="1px" CellPadding="3" 
    OnDataBinding="GridViewMatches_OnBinding"> 
     <Columns> 
      <asp:BoundField DataField="PersonID"><ItemStyle CssClass="hidden"/></asp:BoundField> 
      <asp:TemplateField> 
       <ItemTemplate> 
        <asp:CheckBox ID="CheckBoxSelectedToSend" runat="server" 
         Checked='<%# DataBinder.Eval(Container.DataItem, "SelectedToSend") %>'/> 
       </ItemTemplate> 
... 

답변

9

PreInit 이벤트에서 컨트롤을 반복하면 ('다른 컨트롤 추가'또는 '다른 컨트롤 제거'버튼이 눌려 졌는지 감지하기 위해) 뷰 상태가 무효화됩니다 !!여기

이 PreInit

public Control GetPostBackControl(Page thePage) 
    { 
     //return null; 

     Control myControl = null; 
     string ctrlName = thePage.Request.Params.Get("__EVENTTARGET"); 
     if (((ctrlName != null) & (ctrlName != string.Empty))) 
     { 
      myControl = thePage.Master.FindControl(ctrlName); 
     } 
     else 
     { 
      foreach (string Item in thePage.Request.Form) 
      { 
       Control c = thePage.Master.FindControl(Item); 
       if (((c) is System.Web.UI.WebControls.Button)) 
       { 
        myControl = c; 
       } 
      } 

     } 

     return myControl; 
    } 

(내가 웹에 그것을 발견,이 methd에 대한 더 신용을하지 않음)

첫 번째 줄은 주석의 경우에서 호출하는 방법입니다, viewstate가 유지됩니다.

끔찍한!

+2

감사합니다. 고맙습니다. 천 번, 고마워. 너는 내게 두통을 안겨 줬어. 덧붙여, Page_Init에서도 같은 문제가 발생합니다. – jwd

2

것이 있는지 확인하여 GridViewViewState이 켜져

GridView이 리바운드 또는 지워지지 않는지 확인하십시오.

여전히 작동하지 않으면 GridView의 상위 컨트롤을 확인하고 해당 ViewState이 꺼져 있지 않은지 확인하십시오. ViewState이 해제 된 모든 부모 컨트롤은 모든 자식 컨트롤이 ViewState을 사용하지 않도록합니다.

GridView이 동적 컨트롤 중 하나에 포함되어 있지 않으면 동적 컨트롤이 GridView에 영향을 미치지 않습니다.

+0

안녕하세요, 답변 해 주셔서 감사합니다. ViewView를 활성화하기 위해 GridView def를 변경했습니다 : EnableViewState = "True"그리고 그리드를 한 곳에서만 바인딩했습니다 (마법사의 '다음'이벤트). 아직 작동하지 않습니다! Viewstate는 다른 페이지의 다른 컨트롤 (예 : 마법사의 다른 단계)에서 유용합니다. 이것은 나를 미치게합니다! – Ryan

1

gridview 및 다른 컨트롤에 ID가 있습니까? ID를 지정하지 않거나 포스트 백간에 ID가 변경되면 viewstate 변경 내용이 손실됩니다.

+0

대단한 생각! 그러나 아아, 신분증이 있습니다. 질문에 내 GridView의 정의를 추가했습니다 – Ryan