문제

동적으로 생성 된 컨트롤 (TextBox 및 DropdownList)이 포함 된 페이지가 있습니다. 포스트 백이 발생하면 텍스트 상자는 값을 유지하지만 DropdownList는 ListItems를 잃습니다. 페이지 레벨 드롭 다운 목록도 목록을 유지하기 때문에 이것은 매우 혼란 스럽습니다. 누구든지 아래 코드에 무엇이 잘못되었는지 알 수 있습니까?

이 문제를 해결하는 데 도움이 될 것입니다.

<%@ Page Language="VB"%>

<script runat="server">
  Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs)
    If Not Page.IsPostBack Then
      ddlFixed.Items.Add(New ListItem("12", "13"))
      ddlFixed.Items.Add(New ListItem("14", "15"))
    End If
    Dim i As Integer
    For i = 0 To 3
      Dim ddl As New DropDownList
      ddl.ID = "ddlPage" & i
      ddl.EnableViewState = True
      If Not Page.IsPostBack Then
        ddl.Items.Add(New ListItem("12", "13"))
        ddl.Items.Add(New ListItem("14", "15"))
      End If
      pnlDynamic.Controls.Add(ddl)
      Dim txtBx As New TextBox
      txtBx.ID = "txtPage" & i
      If Not Page.IsPostBack Then
        txtBx.Text = "Preset"
      End If
      pnlDynamic.Controls.Add(txtBx)
    Next
  End Sub
</script>


<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title></title>
</head>
<body>
  <form id="form1" runat="server" enableviewstate="true">
  <div>
    <br />
    <br />
    <a href="Default.aspx">Get-Request</a>
    <br />
    <br />
    <asp:Panel runat="server" ID="pnlDynamic" EnableViewState="true" />    
    <br />
    <br />
    <asp:DropDownList runat="server" ID="ddlFixed" />
    <asp:Button runat="server" ID="btn" Text="Postback"/>
  </div>
  </form>
</body>
</html>
도움이 되었습니까?

해결책

뷰 스테이트를 포스트 백을 가로 질러 유지할 수있는 솔루션을 찾았습니다. ItemCollection의 TrackViewState를 호출하는 것입니다.

CType(ddl.Items, IStateManager).TrackViewState()

도움을 주셔서 감사합니다.

이것은 작업 솔루션입니다.

<%@ Page Language="VB"%>

<script runat="server">
  Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs)
    If Not Page.IsPostBack Then
      ddlFixed.Items.Add(New ListItem("12", "13"))
      ddlFixed.Items.Add(New ListItem("14", "15"))
    End If
    Dim i As Integer
    For i = 0 To 3
      Dim ddl As New DropDownList
      ddl.ID = "ddlPage" & i
      CType(ddl.Items, IStateManager).TrackViewState()
      If Not Page.IsPostBack Then
        ddl.Items.Add(New ListItem("12", "13"))
        ddl.Items.Add(New ListItem("14", "15"))
      End If
      pnlDynamic.Controls.Add(ddl)
      Dim txtBx As New TextBox
      txtBx.ID = "txtPage" & i
      If Not Page.IsPostBack Then
        txtBx.Text = "Preset"
      End If
      pnlDynamic.Controls.Add(txtBx)
    Next
  End Sub
</script>


<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
  <title></title>
</head>
<body>
  <form id="form1" runat="server" >
  <div>
    <br />
    <br />
    <a href="Default.aspx">Get-Request</a>
    <br />
    <br />
    <asp:Panel runat="server" ID="pnlDynamic" />    
    <br />
    <br />
    <asp:DropDownList runat="server" ID="ddlFixed" />
    <asp:Button runat="server" ID="btn" Text="Postback"/>
  </div>
  </form>
</body>
</html>

다른 팁

DDL은 ViewState가 활성화 될 때 항목과 선택을 유지합니다. 결과 HTML이 Postback의 서버에 다시 기록되므로 TextBox는 ViewState에 관계없이 내용을 유지합니다.

코드와 마크 업 에이 ViewState 문장이 모두 있다는 것이 자랑 스럽습니다.

몇 가지 중 하나가 일어나고 있습니다.

  1. 컨트롤의 ViewState는 비활성화되었습니다
  2. Contrl Hierachy 위의 Viewstate는 비활성화되었습니다 (페이지, 양식, 패널)
  3. ViewState에서 선택을로드하기 위해 페이지주기에서 너무 늦게 컨트롤을 동적으로 추가합니다. Init에로드하는 것은 괜찮을 것입니다.

해당 드롭 다운리스트에 대한 ViewState를 명시 적으로 활성화해야 할 수도 있습니다 ...

편집 : 이것은 내 마지막 의견이 의미하는 바입니다 ...

    <script runat="server">
      Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs)
        If Not Page.IsPostBack Then
          ddlFixed.Items.Add(New ListItem("12", "13"))
          ddlFixed.Items.Add(New ListItem("14", "15"))

          Dim i As Integer
          For i = 0 To 3
            Dim ddl As New DropDownList
            ddl.ID = "ddlPage" & i
            ddl.EnableViewState = True
            ddl.Items.Add(New ListItem("12", "13"))
            ddl.Items.Add(New ListItem("14", "15"))

            pnlDynamic.Controls.Add(ddl)
            Dim txtBx As New TextBox
            txtBx.ID = "txtPage" & i
            txtBx.Text = "Preset"
            pnlDynamic.Controls.Add(txtBx)
          Next
        End If
      End Sub
   </script>

나는 항상 사용합니다 Page_Load 그리고 이런 문제가 없습니다. 어쩌면 당신이 볼 수있는 것일 수도 있습니다.

나는 일반적으로 페이지를 처음으로로드 할 때 데이터를 바인딩하고, 그 후에는 viewstate가 Postbacks 등을 처리하도록합니다. Page_Load ...

체크 아웃 http://support.microsoft.com/kb/305141

페이지 이벤트 loadTocNode (2, 'moreinformation'); ASP.NET 페이지의 수명주기 동안, 몇 가지 표준 이벤트가 페이지 물체는 자주 사용됩니다. ASP.NET 페이지 프레임 워크는 이러한 메소드의 실행 시간에 적절한 대의원 인스턴스에 자동으로 연결 (또는 전선을 올리)입니다. 이렇게하면 필요한 "접착제 코드"를 작성하지 않아도됩니다. 다음 목록은 실행 시간에 해고 된 순서대로 연결된 대의원 인스턴스를 제공합니다.
  • page_init:이 이벤트 중에 값을 초기화하거나 가질 수있는 이벤트 핸들러를 연결할 수 있습니다.
  • page_load:이 이벤트 중에 일련의 작업을 수행하여 ASP.NET 페이지를 처음 만들거나 게시물에서 발생하는 클라이언트 측 이벤트에 응답 할 수 있습니다. 이 이벤트 전에 페이지 및 제어보기 상태가 복원되었습니다. 사용 ISPOSTBACK 페이지 속성 페이지가 처음으로 처리되는지 확인하십시오. 처음 인 경우 데이터 바인딩을 수행하십시오. 또한 제어 속성을 읽고 업데이트하십시오.
  • page_databind: Databind 이벤트가 발생하면 이벤트가 제기됩니다 Databind 메소드는 페이지 레벨에서 호출됩니다. 전화하면 Databind 개별 통제에서는 만 해고됩니다 Databind 그 아래에 컨트롤이 발생합니다.
  • page_prerender: 프레 렌더 뷰 상태가 저장되고 컨트롤이 렌더링되기 직전에 이벤트가 발사됩니다. 이 이벤트를 사용하여 컨트롤에서 마지막 순간 작업을 수행 할 수 있습니다.
  • page_unload: 페이지가 렌더링을 마친 후 page_unload 이벤트 화재. 이 이벤트는 최종 청소 작업을 수행하기에 좋은 장소입니다. 여기에는 열린 데이터베이스 연결 정리, 객체 폐기 또는 열린 파일을 닫는 것과 같은 항목이 포함됩니다.
다음 목록은 비 결정적 이벤트를 간략하게 설명합니다.
  • page_error: 페이지 처리 중에 처리되지 않은 예외가 발생하면 오류 이벤트 화재. 그만큼 오류 이벤트는 오류를 우아하게 처리 할 수있는 기회를 제공합니다.
  • page_aborttransaction: 거래 트랜잭션이 성공했는지 또는 실패하는지 여부를 표시하려면 이벤트가 유용합니다. 이 이벤트는 일반적 으로이 이벤트가 주문의 성공 또는 실패를 나타낼 수있는 쇼핑 카트 시나리오에 일반적으로 사용됩니다. 이 사건은 거래가 중단되었을 때 발생합니다.
  • page_committransaction:이 이벤트는 거래가 성공적으로 커밋되었을 때 발생합니다.

드롭 다운 목록의 목록 항목은보기 상태에 저장되지 않습니다. 모든 포스트 백에 추가해야합니다.

보기 상태에 저장되는 것은 선택된 색인 (즉)입니다. 제어의 '가치'.

편집하다: 글쎄, 내가 오늘 뭔가를 배웠습니다. 나는 수정된다 :-)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top