7

動的に作成されたコントロール (TextBox と DropDownList) を含むページがあります。ポストバックが発生すると、TextBox は値を保持しますが、DropDownList は ListItem を失います。ページ レベルの 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>
4

5 に答える 5

6

ポストバック間でビューステートを維持できるソリューションを見つけました。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>
于 2009-03-08T16:32:03.393 に答える
0

それらの 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>
于 2009-03-08T14:15:58.227 に答える
0

ビューステートが有効な場合、DDL はその項目と選択を維持します。結果のhtmlはポストバックでサーバーに書き戻されるため、テキストボックスはビューステートに関係なくその内容を維持します。

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

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

  1. コントロールの ViewState が無効になっています
  2. コントロール階層の上の ViewState は無効です (ページ、フォーム、パネル)
  3. ビューステートから選択項目をロードするには、ページ サイクルでコントロールを動的に追加するのが遅すぎます。INIT でのロードは問題ないはずです。
于 2009-03-08T14:21:02.647 に答える
-1

DropDownList 内のリスト アイテムは、ビュー ステートに格納されません。ポストバックごとにそれらを追加する必要があります。

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

編集:うーん、今日は何かを学んだようです。私は修正されたままです:-)

于 2009-03-08T14:05:43.073 に答える
-1

いつも使っていますPage_Loadが、このようなトラブルはありません。多分あなたが見ることができる何か。

私は通常、ページが最初に読み込まれたときにデータをコントロールにバインドし、その後、Viewstate にポストバックなどを処理させますPage_Load

http://support.microsoft.com/kb/305141をご覧ください

ページ イベント loadTOCNode(2, 'moreinformation'); ASP.NET ページのライフ サイクル中、 Pageオブジェクトから公開されるいくつかの標準イベントが頻繁に使用されます。ASP.NET ページ フレームワークは、これらのメソッドの実行時に適切なデリゲート インスタンスに自動的に接続 (または接続) します。これにより、必要な「グルー コード」を記述する必要がなくなります。次のリストは、実行時に接続されるデリゲート インスタンスを起動順に示しています。
  • Page_Init : このイベント中に、値を初期化するか、任意のイベント ハンドラーを接続できます。
  • Page_Load : このイベント中に、一連のアクションを実行して、初めて ASP.NET ページを作成するか、投稿から生じるクライアント側イベントに応答できます。このイベントの前に、ページとコントロールのビュー状態が復元されました。IsPostBackページ プロパティを使用して、ページの処理が初めてかどうかを確認します。初めての場合は、データバインドを行います。また、コントロール プロパティを読み取り、更新します。
  • Page_DataBind : DataBindイベントは、DataBindメソッドがページ レベルで呼び出されたときに発生します。個々のコントロールでDataBindを呼び出すと、その下にあるコントロールのDataBindイベントのみが発生します。
  • Page_PreRender : PreRenderイベントは、ビュー ステートが保存され、コントロールがレンダリングされる直前に発生します。このイベントを使用して、コントロールで直前の操作を実行できます。
  • Page_Unload : ページのレンダリングが完了すると、Page_Unloadイベントが発生します。このイベントは、最終的なクリーンアップ作業を行うのに適した場所です。これには、開いているデータベース接続のクリーンアップ、オブジェクトの破棄、開いているファイルのクローズなどの項目が含まれます。
次のリストは、非決定的なイベントの概要を示しています。
  • Page_Error : ページの処理中に未処理の例外が発生すると、Errorイベントが発生します。Errorイベントは、エラーを適切に処理する機会を提供します。
  • Page_AbortTransaction :トランザクションが成功したか失敗したかを示したい場合は、トランザクション イベントが役立ちますこのイベントは、このイベントが注文の成功または失敗を示すことができるショッピング カートのシナリオでよく使用されます。このイベントは、トランザクションが中止されたときに発生します。
  • Page_CommitTransaction : このイベントは、トランザクションが正常にコミットされたときに発生します。
于 2009-03-08T14:26:26.283 に答える