2013-07-18 2 views
0

3 단계의 마법사 단계가있는 폼이 있는데, 버튼을 클릭하면 동적으로 텍스트 상자를 추가하면 제대로 작동하지만 다음 단계로 가서 추가를 클릭하면 더 많은 텍스트 상자를 추가하면 이전 단계의 모든 텍스트 상자가 자동으로 추가 된 다음 계속 클릭하면 계속 추가됩니다.ASP .NET 마법사 컨트롤 및 뷰 상태

어떻게 이런 일이 발생하지 않도록 할 수 있습니까?

개인 목록 ControlsList { ) ( { (ViewState를 [ "컨트롤"] == NULL) { 의 ViewState [ "컨트롤"] = 경우 새로운리스트를 얻는다; } return (목록) ViewState [ "controls"]; } }

private int NextID 
{ 
    get 
    { 
     return ControlsList.Count + 1; 
    } 
} 


protected override void LoadViewState(object savedState) 
{ 

    string section = Wizard1.ActiveStep.ID; 
    int sectionNum = Wizard1.ActiveStepIndex; 

    var control = Wizard1.ActiveStep.FindControl("Place" + sectionNum) as PlaceHolder; 

    base.LoadViewState(savedState); 

    int count = 0; 
    foreach (string txtID in ControlsList) 
    { 
     if (count == 0) 
     { 
      control.Controls.Add(new LiteralControl("<tr>")); 
     } 
     TextBox txt = new TextBox(); 
     control.Controls.Add(new LiteralControl("<td>")); 
     txt.ID = txtID; 
     control.Controls.Add(txt); 
     control.Controls.Add(new LiteralControl("</td>")); 

     count = count + 1; 
     if (count == 3) 
     { 
      control.Controls.Add(new LiteralControl("</tr>")); 
      count = 0; 
     } 

    } 
} 


protected void AddControlButton_Click(object sender, EventArgs e) 
{ 


    string section = Wizard1.ActiveStep.ID; 
    int sectionNum = Wizard1.ActiveStepIndex; 

    var control = Wizard1.ActiveStep.FindControl("Place" + sectionNum) as PlaceHolder; 

    TextBox txt1 = new TextBox(); 
    TextBox txt2 = new TextBox(); 
    TextBox txt3 = new TextBox(); 


    txt1.ID = section.ToString() + "Size" + NextID.ToString(); 
    control.Controls.Add(new LiteralControl("<td>")); 
    control.Controls.Add(txt1); 
    control.Controls.Add(new LiteralControl("</td>")); 
    ControlsList.Add(txt1.ID); 

    txt2.ID = section.ToString() + "Description" + NextID.ToString(); 
    control.Controls.Add(new LiteralControl("<td>")); 
    control.Controls.Add(txt2); 
    control.Controls.Add(new LiteralControl("</td>")); 
    ControlsList.Add(txt2.ID); 

    txt3.ID = section.ToString() + "Quantity" + NextID.ToString(); 
    control.Controls.Add(new LiteralControl("<td>")); 
    control.Controls.Add(txt3); 
    control.Controls.Add(new LiteralControl("</td></tr>")); 
    ControlsList.Add(txt3.ID); 

}

답변

0

당신은 ViewState에서 동적 텍스트 상자를 모두 저장하고는 텍스트 상자를 구축 할 때 다음 ControlsList 속성 게터 전체 목록을 반환합니다.

Session["WizardStep1"] = listOfTextBoxesFromStep1; 
Session["WizardStep2"] = listOfTextBoxesFromStep2; 
Session["WizardStep3"] = listOfTextBoxesFromStep3; 
+0

좋은 아이디어가 당신의 응답을 주셔서 감사합니다 :

나의 추천은이 같은 마법사의 각 단계에서 텍스트 상자 컨트롤을 구별 할 수 있기 때문에, 대신 ViewStateSession 캐시를 사용하는 것입니다. 전에는 세션을 사용 해본 적이 없지만 세션을 사용하려면 코드를 수정해야하는 부분을 알려주십시오. – user2593590

+0

동적으로 생성 된 텍스트 상자를 디스크/데이터베이스에 저장하거나 마법사를 실행할 때마다 새로운 경험을하고 있습니까? –

+0

마법사가 실행될 때마다 새로운 경험을합니다. – user2593590