2013-07-25 3 views
0

동일한 동적으로 생성 된 드롭 다운과 해당 viewstate에 문제가 있습니다.동적으로 생성 된 드롭 다운 포스트 백

간단히 말해서, 사용자가 Excel 파일을 업로드하면 파일이 구문 분석되고 해당 데이터에 대한 드롭 다운이 만들어집니다. 이 ASP가 버튼을 누를 때 수행되어, 다음과 같이 제어 테이블에 추가된다

public void generateFromSheet(OrderedDictionary columns, DataTable oppcolumns, List<string> requiredDrops) 
    { 
     int index = 0; 
     foreach (DictionaryEntry entry in columns) 
     { 
      DropDownList ddl = new DropDownList() 
      { 
       ID = "ddlMapping" + entry.Key.ToString(), 
       DataSource = columns, 
       DataTextField = "Key", 
       DataValueField = "Value", 
       SelectedIndex = index, 
       Enabled = requiredDrops.Contains(entry.Key) ? false : true 
      }; 

      ddl.DataBind(); 

      DropDownList ddl2 = new DropDownList() 
      { 
       ID = "OpportunityMappingDdl" + index, 
       DataSource = oppcolumns, 
       DataTextField = "AttributeDisplayName", 
       DataValueField = "TableColumnName" 
      }; 
      ddl2.DataBind(); 


      HtmlTableCell td = new HtmlTableCell() 
      { 
       ID = "tdMapping" + index 
      }; 
      td.Controls.Add(ddl); 

      HtmlTableCell td2 = new HtmlTableCell() 
      { 
       ID = "tdOppMapping" + index 
      }; 
      td2.Controls.Add(ddl2); 

      HtmlTableRow tr = new HtmlTableRow() 
      { 
       ID = "trMapping" + index 
      }; 
      tr.Cells.Add(td); 
      tr.Cells.Add(td2); 

      tblFileMapping.Rows.Add(tr); 
      index++; 
     } 
    } 

그러나,이 후 각 포스트 백 드롭 다운이 소거된다. 필자는 솔루션을 온라인에서 찾아 보았습니다. 일반적으로 모든 것이 ViewState에서 상태를 복원 할 수 있도록 작성된 것과 동일한 ID를 사용하여 컨트롤을 다시 작성합니다. 나는 해봤이 내가의 ViewState에 작성해야하는지에 저장하여 아래에 다음과 같이

public void generateFromViewState() 
    { 
     OrderedDictionary columns = (OrderedDictionary) ViewState["XLColumns"]; 

     int index = 0; 
     foreach (DictionaryEntry entry in columns) 
     { 
      DropDownList ddl = new DropDownList() 
      { 
       ID = "ddlMapping" + entry.Key.ToString(), 
      }; 

      DropDownList ddl2 = new DropDownList() 
      { 
       ID = "OpportunityMappingDdl" + index, 
      }; 

      HtmlTableCell td = new HtmlTableCell() 
      { 
       ID = "tdMapping" + index 
      }; 
      td.Controls.Add(ddl); 

      HtmlTableCell td2 = new HtmlTableCell() 
      { 
       ID = "tdOppMapping" + index 
      }; 
      td2.Controls.Add(ddl2); 

      HtmlTableRow tr = new HtmlTableRow() 
      { 
       ID = "trMapping" + index 
      }; 
      tr.Cells.Add(td); 
      tr.Cells.Add(td2); 

      tblFileMapping.Rows.Add(tr); 
      index++; 
     } 
    } 

나는를 Page_Load에서이 메소드를 호출하지만 컨트롤은 이전 데이터와 선택된 값을 유지하지 않습니다.

그래서 잘못 여기에 몇 가지 :

컨트롤이 재현 그러나 그들의 상태가 복원되지 않습니다를 Page_Load에
  • .
  • 몇 가지 기술적 인 이유로 프로젝트 관리자는 세션 상태를 사용하여 저장하지 말아야한다고 언급했습니다.
  • 다른 PM이 page_init에서 컨트롤을 재생성해야한다고 조언했습니다. 하지만 ViewState에 컨트롤 데이터를 저장하고 있기 때문에 viewstate가 준비되지 않았고 데이터가 null이기 때문에 이것이 불가능합니다.

누구나 성공적으로 동적으로 생성 된 컨트롤에 대한 viewstate를 복원하는 방법에 대해 조언 할 수 있습니다. 모든 것을 검색해 보았고 여러 가지 솔루션을 온라인에서 시도했지만 시도하지 않은 것은 효과가있는 것 같습니다.

감사합니다.

+0

Repeater, Datagrid 또는 Gridview와 같은 Repeater를 사용하는 대신 HTML 표 셀과 ROWS 및 Column을 렌더링하는 특별한 이유가 있습니다. –

+0

아니요, 기존 페이지를 수정 중이며 내용이이 문제에서 생성됩니다. 다른 곳에서 나는 그것을 따라갈 것이라고 생각했다. 이러한 컨트롤은 OnInit에서 필요한 데이터가 사전에 저장되어 있으므로 수행됩니다. 그렇지 않으면 상태가 유지됩니다. Repeater 나 Datagrid를 사용하면 문제가 해결됩니까? – SikhWarrior

답변

1

당신은 제대로하고 있지만 데이터 소스로 컨트롤을 다시 만들고 모든 컨트롤을 다시 바인딩해야합니다. 이 beeing이 끝나지 않으면, 이전과 일치하지 않는 컨트롤을 생성하게됩니다. 첫 번째 방법으로 전화를 걸 수 있습니다.

+0

보기 상태가 클라이언트 측에서 서버 및 서버 측으로 클라이언트로 전송되므로 뷰티가 뷰 스테이트에 저장하는 것은 나쁜 호출입니다. 각 뷰에 저장된 모든 데이터를 다운로드하고 업로드 할 것입니다. 다시 게시. –

+0

각 드롭 다운에서 사용자의 선택을 복원 할 수 있어야합니다.이 솔루션도이를 수행 할 것인가, 아니면 어딘가에 저장해야 할 것입니까? – SikhWarrior

+0

이 솔루션도 그렇게 할 것입니다. viewstate가 알고있는 것과 동일한 컨트롤을 다시 만들 것이기 ​​때문입니다. 포스트 백이 끝나면 viewstate는 해당 컨트롤을 찾아 이전 상태로 만듭니다. –

관련 문제