動的に作成されたDropDownListがポストバックでListItemを失う
-
05-07-2019 - |
質問
動的に作成されたコントロール(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がポストバックでサーバーに書き戻されるため、ビューステートに関係なくコンテンツを維持します。
これらのビューステートステートメントがすべてコードとマークアップに含まれているのは興味深いことです。
次のいずれかが発生しています:
- コントロールのViewStateは無効です
- contrl階層の上にあるViewStateは無効になっています(ページ、フォーム、パネル)
- 選択をビューステートからロードするには、ページサイクルの後半でコントロールを動的に追加しています。 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のリストアイテムはビューステートに保存されません。ポストバックごとに追加する必要があります。
ビューステートに保存されるのは、選択されたインデックスです。コントロールの「値」。
編集:さて、今日は何かを学んだようです。私は訂正します:-)