2013-02-20 1 views
0

이것이 내 문제입니다. 잘못된 것이 있으면 사과드립니다. 나는 Asp.net을 처음 사용합니다. 여기 내 문제가 있습니다 :Viewstate 동적 컨트롤 (ListBox 포함)로드 문제

나는 미리 구성된 ListBox 이상으로 사용자 정의 컨트롤을 추가하는 "컨트롤 추가 버튼"이 있습니다. (아이디어는 사용자가 필요로하는만큼 많은 UserControls를 추가합니다.) 지금까지는 그렇게 좋았습니다. ListBox 안에 요소를 표시 할 때 Selection은 첫 번째 포스트 백 이후에 손실됩니다 (예 : 컨트롤 추가 버튼을 클릭 한 후). 라이프 사이클 문제가 될 수 있습니다. 내 잘못 된 솔루션 (그물에서 찾은 것에서 조정)은 다음과 같습니다. 목록을 사용하여 ID를 기반으로 모든 사용자 정의 컨트롤을 복원합니다. 고맙습니다. 여기

protected List<string> ControlsList 
{ 
    get 
    { 
     if (ViewState["controls"] == null) 
     { 
      ViewState["controls"] = new List<string>(); 
     } 
     return (List<string>)ViewState["controls"]; 
    } 
} 

//Restore Controls based on IDs in ControlsList 
protected override void LoadViewState(object savedState) 
{ 
    base.LoadViewState(savedState);   

foreach (string contrID in ControlsList) 
    { 
      Control c; 
      c = LoadControl("v1.ascx"); 
      c.ID = "v1-" + contrID; 
      PlaceHolder1.Controls.Add(c); 
     } 

//Button Click adds Control 
protected void addControl(object sender, EventArgs e) 
{ 
    Control c; 
    c = LoadControl("v1.ascx"); 
    c.ID = "v1-" + NextID.ToString(); 
    ControlsList.Add(c.ID); 
    PlaceHolder1.Controls.Add(c); 
} 

사용자 제어 : 다음은 코드는

public partial class v1 : System.Web.UI.UserControl 
{ 
protected void Page_Init(object sender, EventArgs e) 
{ 
    v1_ListBox1.DataSourceID = "A1Vm1_SqlDataSource"; 
    v1_ListBox1.DataTextField = "Vm1"; 
    v1_ListBox1.DataValueField = "Vm1"; 
    v1_ListBox1.SelectionMode = ListSelectionMode.Multiple; 

} 

답변

1

당신은 당신의 ViewState가

protected override object SaveViewState() 
{ 
    var a = this.ControlsList; 
    var b = base.SaveViewState(); 
    if (a.Count == 0 && b == null) 
     return null; 

    return new System.Web.UI.Pair(a, b); 
} 

protected override void LoadViewState(object savedState) 
{ 
    if (savedState == null) 
     return; 

    var pair = (System.Web.UI.Pair)savedState; 
    if (pair.First != null) 
    { 
     foreach (var id in (IList<string>)pair.First) 
     { 
      // add the control 
     } 
    } 

    if (pair.Second != null) 
     base.LoadViewState(pair.Second); 
} 

이 방법을 먼저 자식 컨트롤을 초기화하게됩니다 다음 저장하는 방법을 변경해야합니다 그들을 위해 viewstate를로드하십시오.

컨트롤을 동적으로 추가하는 ViewStateModeByIdAttribute을 추가하여 컨트롤 제거를 시작해도 viewstate로드가 실패하지 않도록 할 수 있습니다.

+0

당신은 남자입니다. 나는 이것에 대해 며칠 동안 고생했다. 귀하의 솔루션은 문제 해결 방법뿐만 아니라 문제에 대한 통찰력을 얻었습니다. 감사 – neonbarbarian