質問

動的に作成されたコントロール(TextBoxおよびDropDownList)を含むページがあります。ポストバックが発生すると、TextBoxは値を保持しますが、DropDownListはListItemを失います。 ページレベルのDropDownListもListItemを保持するため、これは非常に混乱します。誰でも以下のコードの何が問題なのかわかりますか?

この問題の解決にご協力いただければ幸いです。

<%@ 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はそのアイテムと選択を維持します。テキストボックスは、結果のhtmlがポストバックでサーバーに書き戻されるため、ビューステートに関係なくコンテンツを維持します。

これらのビューステートステートメントがすべてコードとマークアップに含まれているのは興味深いことです。

次のいずれかが発生しています:

  1. コントロールのViewStateは無効です
  2. contrl階層の上にあるViewStateは無効になっています(ページ、フォーム、パネル)
  3. 選択をビューステートからロードするには、ページサイクルの後半でコントロールを動的に追加しています。 INITでの読み込みは問題ありません。

これらのDropDownListsの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がポストバックなどを処理できるようにします。 Page_Load の間にデータをバインドすることをお勧めします...

http://support.microsoft.com/kb/305141

ページイベント                 loadTOCNode(2、 '詳細情報');              ASP.NETページのライフサイクル中に、いくつかの標準イベント            Page オブジェクトから公開されているものは頻繁に使用されます。 ASP.NETページフレームワーク           実行時に適切なデリゲートインスタンスに自動的に接続(または接続)します           これらの方法の時間。これにより、必要な&quot; glueを書く必要がなくなります。           コード。&quot;次のリストは、で接続されているデリゲートインスタンスを示しています。           実行される順番で実行時間:           
  • Page_Init :このイベント中に、値を初期化するか、                 あなたが持っているかもしれないイベントハンドラ。
  • Page_Load :このイベント中に、あなたは                 ASP.NETページを初めて作成するか、クライアント側のイベントに応答する                 投稿の結果です。ページとコントロールのビューステートが復元されました                 このイベントの前。 IsPostBack ページプロパティを使用して、これが初めてかどうかを確認します。                 ページは処理中です。初めての場合は、データバインディングを実行します。また、                 コントロールプロパティの読み取りと更新。
  • Page_DataBind DataBind メソッドがページで呼び出されると、 DataBind イベントが発生します。レベル。個々のコントロールで DataBind を呼び出すと、その下のコントロールの DataBind イベントのみが発生します。
  • Page_PreRender :ビューステートが保存される直前に PreRender イベントが発生し、                 コントロールがレンダリングされます。このイベントを使用して、最後の最後を実行できます                 
  • Page_Unload :ページのレンダリングが完了すると、 Page_Unload イベントが発生します。このイベントは、最終的なクリーンアップを実行するのに適した場所です                 作業。これには、開いているデータベース接続のクリーンアップ、                 オブジェクトを破棄するか、開いているファイルを閉じます。
次のリストに、イベントの概要を示します。           非決定的:           
  • Page_Error :ページ処理中に未処理の例外が発生すると、 Error イベントが発生します。 Error イベントは、適切に処理する機会を提供します                 errors。
  • Page_AbortTransaction Transaction イベントは、トランザクションが                 成功または失敗します。このイベントは、一般的にショッピングカートのシナリオで使用されます                 このイベントは、注文の成功または失敗を示すことができます。このイベント                 トランザクションが中止されたときに発生します。
  • Page_CommitTransaction :このイベントは、トランザクションがコミットされたときに発生します                 

DropDownListのリストアイテムはビューステートに保存されません。ポストバックごとに追加する必要があります。

ビューステートに保存されるのは、選択されたインデックスです。コントロールの「値」。

編集:さて、今日は何かを学んだようです。私は訂正します:-)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top