2013-10-08 3 views
1

SearchCriteria 객체를 만들기위한 몇 가지 체크 박스 등이있는 ASP.NET 웹 폼이 있습니다. 제출 버튼을 클릭하면 repeater1에게 SearchCriteria에 따라 일부 레코드를 표시하도록 요청합니다. repeater1 내부에서 나는 updatepanel과 또 다른 하나의 repeater (ChildRepeater)로 사용자를 제어한다.ASP.NET은 포스트 백 이후에 양식에서 데이터를 잃습니다. 리피터 내부의 리피터 내부에있는 리피터

내 문제 : 포스트 백 이후에 버튼을 클릭하면 양식의 모든 데이터가 손실됩니다 (예 : 체크 박스가 선택됨). 페이지가 기본값을로드하고 있지만 코드에서 (! IsPostBack) 경우에만 기본값 (모든 확인란이 선택됨)이로드됩니다. 당연히 나는 "EnableViewState = true"aspx에서, 나는 또한 세션에서 데이터를 저장하려고했지만 또한 작동하지 않습니다 (기본값은이 설정을 다시 작성합니다).

리피터 (리피터 1)가있을 때 포스트 백 이후의 양식에는 모든 데이터가 포함되어 있으므로 updatepanel에 문제가 있다고 생각하지만 정확히 어디서 왔는지는 알 수 없습니다. 페이지를 다시로드 한 후 양식의 데이터가 손실되는 이유를 설명해 주시겠습니까? 나는 어떤 실수도 볼 수 없다. ..

나의 파일은있다. 그러나 나는 n-tier architecture를 가지고있다. .. View/BLL (DAL과 sql 연결이 잘 작동한다)에서 필요한 파일 만 넣는다. 여기

<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> 

    <asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound"> 
     <HeaderTemplate> 
      <table style="border: 1px solid #0000FF; width: 1250px"> 
       <tr style="background-color: #3d6db0; color: #000000; font-weight: bold;"> 

        <td style="width: 150px;">Numer</td> 
        <td style="width: 150px;">Przedmiot umowy</td> 
        <td style="width: 150px;">Odbiorca</td> 
        <td style="width: 150px;">Dostawca</td> 
        <td style="width: 150px;">Rodzaj umowy</td> 
        <td style="width: 150px;">Charakter umowy</td> 
        <td style="width: 150px;">Status wypożyczenia</td> 
        <td style="width: 150px;">Data podpisania</td> 
        <td style="width: 150px;">Status</td> 
       </tr> 
     </HeaderTemplate> 

     <itemtemplate> 
     <uc1:FilesRepeaterControl runat="server" id="FilesRepeaterControl" /> 
      </itemtemplate> 
     <FooterTemplate>   
      </table> 
     </FooterTemplate> 
    </asp:Repeater> 

ShowAgreements.aspx.cs :

AgreementsSearchCriteria AgreementSearchCriteriaObj = new AgreementsSearchCriteria(); 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      Controller.ReadDostawcy(); 
      Controller.ReadOdbiorcy(); 
      Controller.ReadPracownikOdp(); 
     } 

     Controller.ReadAllAgreements(); 
    } 
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
     { 
      Agreement umowa = e.Item.DataItem as Agreement; 
      BazaUmow.Controls.FilesRepeaterControl test = e.Item.FindControl("FilesRepeaterControl") as FilesRepeaterControl; 
      test.umowa = umowa; 
     } 

    } 


protected void szukaj_Click(object sender, EventArgs e) 
    { 
     if (IsValid == true) 
     { 
      AddNaviPoint(); 
      Controller.ReadAllAgreements(); 
     } 

    } 
public AgreementSearchCollection BindUmowyResults 
    { 
     set 
     { 
      Repeater1.DataSource = value; 
      Repeater1.DataBind(); 
     } 
    } 
,691 screen

ShowAgreements.aspx은 (는 컨트롤과 부모 리피터 포함) : 어떻게 보이는지 화면이 제어 언어 = "C#을"으로 AutoEventWireup = "true"를 숨김 = "FilesRepeaterControl.ascx.cs"상속 @

FilesRepeaterControl.ascx <% = "BazaUmow.Controls.FilesRepeaterControl"%>

  <tr> 
       <td style="width: 150px"> 
        <asp:Button ID="btnRozwin" runat="server" Text="+" OnClick="btnRozwin_Click" /> 
        <asp:LinkButton ID="lbl_numerUmowy" runat="server" OnClick="lbl_numerUmowy_Click"></asp:LinkButton> 
       </td> 

       <td style="width: 150px"> 
        <asp:Label ID="lbl_przedmiotUmowy" runat="server" /></td> 
       <td style="width: 150px"> 
        <asp:Label ID="lbl_odbiorca" runat="server" /></td> 
       <td style="width: 150px"> 
        <asp:Label ID="lbl_dostawca" runat="server" /></td> 
       <td style="width: 150px"> 
        <asp:Label ID="lbl_rodzajUmowy" runat="server" /></td> 
       <td style="width: 150px"> 
        <asp:Label ID="lbl_charakterUmowy" runat="server" /></td> 
       <td style="width: 150px"> 
        <asp:Label ID="lbl_statusWypozyczenia" runat="server" /></td> 
       <td style="width: 150px"> 
        <asp:Label ID="lbl_dataPodpisania" runat="server" /></td> 
       <td style="width: 150px"> 
        <asp:Label ID="lbl_statusUmowy" runat="server" /></td> 

      </tr> 
      <tr> 
       <td> 
        <asp:UpdatePanel ID="UpdatePanelFilesInfo" runat="server"> 
         <ContentTemplate> 
       <asp:Repeater ID="filesRptr" runat="server" OnItemDataBound="filesRptr_ItemDataBound"> 
       <HeaderTemplate> 
        <table style=" width:170px"> 
         <tr style="font-weight: bold;"> 
          <td style="width:170px;">Pliki umowy</td> 

         </tr> 
       </HeaderTemplate> 
       <ItemTemplate> 
        <tr> 
         <td> 
          <asp:LinkButton ID="lblPlikUmowy" runat="server" OnCommand="lblPlikUmowy_Command"></asp:LinkButton></td> 

        </tr> 

       </ItemTemplate> 
       <FooterTemplate> 
        </table> 

       </FooterTemplate> 
      </asp:Repeater> 


       <asp:Repeater ID="aneksyRptr" runat="server" OnItemDataBound="aneksyRptr_ItemDataBound"> 

        <HeaderTemplate> 
        <table style=" width:170px"> 
         <tr style="font-weight: bold;"> 
          <td style="width:170px;">Aneksy do umowy</td> 

         </tr> 
       </HeaderTemplate> 
       <ItemTemplate> 
        <tr> 
         <td> 
          <asp:LinkButton ID="lblAneksUmowy" runat="server" OnCommand="lblAneksUmowy_Command"></asp:LinkButton></td> 

        </tr> 

       </ItemTemplate> 
       <FooterTemplate> 
        </table> 

       </FooterTemplate> 
      </asp:Repeater> 
      </ContentTemplate> 

        </asp:UpdatePanel> 
       </td> 
      </tr> 

FilesRepeaterControl.ascx .cs (여기서 우리는 부모 리피터에 데이터를 추가하고 btnRozwin 버튼을 클릭하면 두 개의 자식 리피터를 채 웁니다) 공개 동의 umowa {get; 세트; 당신이 당신의 업데이트 패널을 다시 게시 할 때, 당신은 모든 데이터를 저장할 수 있습니다 손실이 판넬에 있던 그래서 모든 데이터를 페이지 (업데이트 패널로 둘러싸여 있습니다) 일부를 갱신하기 때문에}

protected void Page_Load(object sender, EventArgs e) 
    { 
       lbl_numerUmowy.Text = umowa.numer_umowy.ToString(); 
       lbl_przedmiotUmowy.Text = umowa.przedmiot_umowy.ToString(); 
       lbl_odbiorca.Text = umowa.odbiorca_tekst.ToString(); 
       lbl_dostawca.Text = umowa.dostawca_tekst.ToString(); 
       lbl_rodzajUmowy.Text = umowa.rodzaj_umowy_tekst.ToString(); 
       lbl_charakterUmowy.Text = umowa.charakter_umowy_tekst.ToString(); 
       lbl_statusWypozyczenia.Text = umowa.status_wypozyczenia_tekst.ToString(); 
       lbl_dataPodpisania.Text = umowa.data_podpisania.ToString("yyyy-MM-dd"); 
       lbl_statusUmowy.Text = umowa.status_umowy.ToString(); 
    } 

    protected void filesRptr_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 

     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
     { 
      Plik plik = e.Item.DataItem as Plik; 

      LinkButton lblPlikUmowy = e.Item.FindControl("lblPlikUmowy") as LinkButton; 
      lblPlikUmowy.Text = plik.nazwa_pliku.ToString(); 
      lblPlikUmowy.CommandArgument = plik.guid + plik.rozszerzenie; 

     } 

    } 


    protected void aneksyRptr_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
     { 
      Plik plik = e.Item.DataItem as Plik; 

      LinkButton lblAneksUmowy = e.Item.FindControl("lblAneksUmowy") as LinkButton; 
      lblAneksUmowy.Text = plik.nazwa_pliku.ToString(); 
      lblAneksUmowy.CommandArgument = plik.guid + plik.rozszerzenie; 

     } 

    } 

    protected void btnRozwin_Click(object sender, EventArgs e) 
    { 
     if (btnRozwin.Text == "+") 
     { 
      filesRptr.Visible = true; 
      aneksyRptr.Visible = true; 

      filesRptr.DataSource = Controller.ReadFilesByAgreement(Convert.ToInt32(lbl_numerUmowy.Text), 1); 
      filesRptr.DataBind(); 

      aneksyRptr.DataSource = Controller.ReadFilesByAgreement(Convert.ToInt32(lbl_numerUmowy.Text), 2); 
      aneksyRptr.DataBind(); 

      btnRozwin.Text = "-"; 

     } 

     else 
     { 
      filesRptr.Visible = false; 
      aneksyRptr.Visible = false; 
      btnRozwin.Text = "+"; 

     } 

    } 

    protected void lbl_numerUmowy_Click(object sender, EventArgs e) 
    { 
     string numer_umowy = ((LinkButton)sender).Text; 
     Page.Response.Redirect("~/SeeAgreementData.aspx?numer=" + numer_umowy + "&email=" + Request.QueryString["email"]); 
    } 

} 
+0

코드, aspx 및 코드 뒤에 간단한 버전을 게시하려고합니다. –

+0

시도한 코드를 게시 할 수 있습니까? –

답변

2

그것은입니다 당신은 당신이 데이터를 얻을

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (ViewState["saveUpdatePanelData"]!= null) 
    { 
     checkedIds = ViewState["saveUpdatePanelData"] as List<int>; 
    } 
} 

이 방법의 ViewState 작품입니다 초기화 할 수 있습니다 게시 후 pageload보다

protected void UpdatePanelClick_OnClick(object sender, EventArgs e) 
{ 
    List<int> checkedIds = new List<int>(); 
    //working with grid saving ids on list 
    ViewState["saveUpdatePanelData"] = checkedIds; 
} 

의 ViewState

에 필요합니다.

+0

.aspx 사이트에서 EnableViewState = "true"만 사용하면 충분하지 않고 이러한 목록을 사용해야합니까? 그리고 이상한 발견하지만 양식 (체크 박스 등의 상태 - 내가 추가 한 화면 참조)이 updatepanel에 없기 때문에 enableviewstate에 저장해야한다고 생각합니다. 틀렸습니까? –

+0

그런데 btnRozwin을 클릭하면 @guitargirl, 서버의 전체 페이지를 다시 게시합니다 (일부가 아닌). 그래서 그것이 당신의 pageload에서 초기화하는 thats. btnRozwin을 updatepanel에 넣으십시오. ViewState obj에 대한 정보를 저장할 수 있습니다. – Def

관련 문제