2012-10-04 2 views
-1

나는 이전에 누군가의 코드를 받았고 자신이 좋아하는 것으로 수정했습니다. 그러나, 나는 그들의 코드를 잘못 해석하고 있을지도 모르지만, 버튼을 세 번 클릭하면 테이블이 완전히 엉망이됩니다. 나는 "사고를 추가하려면 여기를 클릭하십시오"를 클릭 할 때마다 테이블로 동적 텍스트 상자를 만들고 세션에 저장합니다.동적 세션 변수 저장소 (세 번째 시도에서 테이블이 작동하지 않음)

2를 클릭 :

2nd Click

3 클릭 :

3rd Click

나는 그것을 디버깅을 시도하고 그것은 그냥 이렇게 왜 이해가되지 않습니다. 내 코드가 정확하다고 나는 믿는다. 나는 무엇이 잘못 될지 모른다.

public partial class employment_driversapplication_History : System.Web.UI.Page 
{ 
protected void Page_Load(object sender, EventArgs e) 
{ 


} 

protected int TotalNumberAdded 
{ 
    get { return (int)(ViewState["TotalNumberAdded"] ?? 0); } 
    set { ViewState["TotalNumberAdded"] = value; } 


} 



protected void AccidentButton_Click(object sender, EventArgs e) 
{ 
    TotalNumberAdded++; 
    // AddControls(TotalNumberAdded); 
    BuildControls(); 


} 
protected void PrevPage_Click(object sender, EventArgs e) 
{ 

    Response.Redirect("employment_driversapplication_personalinfo.aspx"); 

} 

private IList<TextBox> AddedControls = new List<TextBox>(); 
private IList<Label> AddedControlsLabel = new List<Label>(); 
protected override void CreateChildControls() 
{ 
    BuildControls(); 
    base.CreateChildControls(); 
} 

private void BuildControls() 
{ 






    AccidentPlaceHolder.Controls.Add(new LiteralControl("<table><tr>")); 
    AccidentPlaceHolder.Controls.Add(new LiteralControl("<br />")); 

    for (var Nl = 0; Nl < TotalNumberAdded; Nl++) 
    { 
     var idNL = String.Format("NatureLabel{0}", Nl); 


     //Check if control was already added 
     //only create controls that are new for this postback 
     if (AccidentPlaceHolder.FindControl(idNL) == null) 
     { 
      var NLabel = new Label() { ID = idNL }; 
      NLabel.Text = "Nature Of Accident: "; 
      AccidentPlaceHolder.Controls.Add(new LiteralControl("<td class='title-text'>")); 
      AccidentPlaceHolder.Controls.Add(NLabel); 

      AddedControlsLabel.Add(NLabel); 

     } 
    } 




    for (var x = 0; x < TotalNumberAdded; x++) 
    { 
     var idN = String.Format("NatureTextBox{0}", x); 

     //Check if control was already added 
     //only create controls that are new for this postback 
     if (AccidentPlaceHolder.FindControl(idN) == null) 
     { 
      var NtextBox = new TextBox() { ID = idN }; 

      AccidentPlaceHolder.Controls.Add(new LiteralControl("</td><td class='title-text'width='180px'>")); 
      AccidentPlaceHolder.Controls.Add(NtextBox); 

      AddedControls.Add(NtextBox); 

     } 
    } 

    for (var DL = 0; DL < TotalNumberAdded; DL++) 
    { 
     var idDL = String.Format("DateLabel{0}", DL); 


     //Check if control was already added 
     //only create controls that are new for this postback 
     if (AccidentPlaceHolder.FindControl(idDL) == null) 
     { 
      var DLabel = new Label() { ID = idDL }; 
      DLabel.Text = "Date: "; 
      AccidentPlaceHolder.Controls.Add(new LiteralControl("</td><td class='title-text'>")); 
      AccidentPlaceHolder.Controls.Add(DLabel); 

      AddedControlsLabel.Add(DLabel); 

     } 
    } 


    for (var d = 0; d < TotalNumberAdded; d++) 
    { 
     var idD = String.Format("DateTextBox{0}", d); 
     if (AccidentPlaceHolder.FindControl(idD) == null) 
     { 

      var DtextBox = new TextBox() { ID = idD }; 

      AccidentPlaceHolder.Controls.Add(new LiteralControl("</td><td class='title-text'width='180px'>")); 
      AccidentPlaceHolder.Controls.Add(DtextBox); 
      AddedControls.Add(DtextBox); 
      AccidentPlaceHolder.Controls.Add(new LiteralControl("</td></tr>")); 

     } 


    } 

    for (var FL = 0; FL < TotalNumberAdded; FL++) 
    { 
     var idFL = String.Format("FatalLabel{0}", FL); 


     //Check if control was already added 
     //only create controls that are new for this postback 
     if (AccidentPlaceHolder.FindControl(idFL) == null) 
     { 
      var FLabel = new Label() { ID = idFL }; 
      FLabel.Text = "Fatalities: "; 
      AccidentPlaceHolder.Controls.Add(new LiteralControl("<tr><td class='title-text'>")); 
      AccidentPlaceHolder.Controls.Add(FLabel); 

      AddedControlsLabel.Add(FLabel); 

     } 
    } 
    for (var f = 0; f < TotalNumberAdded; f++) 
    { 
     var idF = String.Format("FatalTextBox{0}", f); 
     if (AccidentPlaceHolder.FindControl(idF) == null) 
     { 

      var FtextBox = new TextBox() { ID = idF }; 
      AccidentPlaceHolder.Controls.Add(new LiteralControl("</td><td class='title-text'width='180px'>")); 
      AccidentPlaceHolder.Controls.Add(FtextBox); 
      AddedControls.Add(FtextBox); 


     } 


    } 

    for (var IL = 0; IL < TotalNumberAdded; IL++) 
    { 
     var idIL = String.Format("InjuryLabel{0}", IL); 


     //Check if control was already added 
     //only create controls that are new for this postback 
     if (AccidentPlaceHolder.FindControl(idIL) == null) 
     { 
      var ILabel = new Label() { ID = idIL }; 
      ILabel.Text = "Injuries: "; 
      AccidentPlaceHolder.Controls.Add(new LiteralControl("</td><td class='title-text'>")); 
      AccidentPlaceHolder.Controls.Add(ILabel); 

      AddedControlsLabel.Add(ILabel); 

     } 
    } 
    for (var i = 0; i < TotalNumberAdded; i++) 
    { 
     var idI = String.Format("InjuryTextBox{0}", i); 
     if (AccidentPlaceHolder.FindControl(idI) == null) 
     { 

      var ItextBox = new TextBox() { ID = idI }; 

      AccidentPlaceHolder.Controls.Add(new LiteralControl("</td><td class='title-text'width='180px'>")); 
      AccidentPlaceHolder.Controls.Add(ItextBox); 
      AddedControls.Add(ItextBox); 
      AccidentPlaceHolder.Controls.Add(new LiteralControl("</td></tr>")); 

     } 


    } 
    AccidentPlaceHolder.Controls.Add(new LiteralControl("</table>")); 
} 

protected override void OnPreRender(EventArgs e) 
{ 
    foreach (var ctrl in AddedControls) 
    { 
     var key = ctrl.ID.Replace("TextBox", String.Empty); 
     Session[key] = ctrl.Text; 
    } 

    foreach (string session in Session.Keys) 
    { 
     System.Diagnostics.Debug.WriteLine(String.Format("{0} = {1}", session, Session[session])); 
    } 
    base.OnPreRender(e); 
} 

} 

도움

내가보고 몇 시간 동안 디버깅 봤는데 ... 감사하겠습니다 아무것도를 해결하지 않았다.

+0

그래 내가 사이트에 새로 온 사람. .. 전체 동의에 대해 안다. 그리고 조금 전에 받아들이지 마라. .. 미안. ( – user1574685

+0

만일 내가 참가하는 모두에게 많은 많은 점을 줄 수 있으면 :) – user1574685

+0

나는 당신이 추천했던 것을했다. .. 그리고 처음 두 개의 "테이블"을 하나에 넣는 것 같습니다. 태그가 구현되고 있지 않지만 왜 – user1574685

답변

1

리피터를 구현해 보셨습니까? 리터럴 컨트롤을 추가하면 손쉽게 벗어나 디버깅하기가 더 어려워 지므로 훨씬 쉽습니다.

중계 제어의 용도 중 하나는 각 데이터 항목에 대해 html 출력을 반복하는 것입니다. 귀하의 경우 사고마다 테이블의 출력을 반복 할 것입니다.

예를 들어,이 프런트 엔드에 코드가 될 것이다 :

<asp:Repeater ID="rptAccidents" runat="server"> 
    <ItemTemplate> 
     <table> 
      <tr> 
       <td class="title-text"> 
        Nature Of Accident 
       </td> 
       <td class='title-text' width='180px'> 
        <asp:TextBox ID="txtNature" runat="server" /> 
       </td> 
       <td class="title-text"> 
        Date 
       </td> 
       <td class='title-text' width='180px'> 
        <asp:TextBox ID="txtDate" runat="server" /> 
       </td> 
      </tr> 
      ....NEXT ROWS 
     </table> 
    </ItemTemplate> 
    <SeparatorTemplate> 
     <br /> 
    </SeparatorTemplate> 
</asp:Repeater> 

그리고이 코드 숨김에있을 것입니다 :

//HERE YOU ARE ATTACHING TO THE REPEATER'S ITEMDATABOUND EVENT 
    //THIS ALLOWS YOU TO CONTROL THE OUTPUT FOR EACH ACCIDENT 
    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 
     this.rptAccidents.ItemDataBound += rptAccidents_ItemDataBound; 
    } 

    //THIS IS THE CODE THAT WILL RUN FOR EACH DATA ITEM IN THE REPEATER'S DATA SOURCE 
    void rptAccidents_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     //in this case, you only care about the item templates 
     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
     { 
      //cast your dataitem here 
      Accident data = (Accident)data; 
      //find the appropriate textbox (or any other control that is runat="server", and set the value. 
      ((TextBox)e.Item.FindControl("txtNature")).Text = data.Nature; 
      ((TextBox)e.Item.FindControl("txtDate")).Text = data.Date; 
     } 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!this.IsPostBack) 
     { 
      this.rptAccidents.DataSource = //I AM NOT SURE WHERE YOU ARE STORING THE DATA. BUT HERE IS WHERE YOU WOULD SET THE REPEATERS DATA SOURCE 
      this.rptAccidents.DataBind(); //THIS LINE CAUSES THE REPEAT TO BIND ITSELF TO YOUR DATA SOURCE 
     } 
    } 
+0

HTML로 시작한 다음 C#을 배웠고 ASP.net을 배웠습니다. 테이블과 같은 의미의 리피터 thistable = new Table(); 그리고 전체 행 물건? 나는 그것이 for 루프를 여러 번 통과하기 때문에 label와 texbox를 같은 테이블에 몇 번 던지고 있다는 것을 깨달았다. 그래서 그것들을 분리하는 방법을 찾아야한다. – user1574685

관련 문제