WebControls.TextBoxポストバック間で存続する追加のプロパティを追加することを目的として、標準から派生したASP.NETクラスを作成しました。ただし、これらのプロパティの値を永続化する方法がわかりません。
ViewStateハンドラーの一部としてプロパティの値をコントロールに設定しようとしましたが、まだ設定されていないため、ポストバックPreRenderのハンドラーで値にアクセスできません。InitViewState
コントロールのハンドラーで値を探すことはできますが、コントロールを使用しているページ/ユーザーコントロールがハンドラー中にプロパティ値を要求した場合、コントロールはまだハンドラーに到達していないため、そこにはありません。ViewStateLoadLoadLoad
私の現在のクラスは次のようになります...
Public Class MyTextBox
Inherits TextBox
Private _myParam As String = ""
Public Property MyParam As String
Get
Return _myParam
End Get
Set(value As String)
_myParam = value
End Set
End Property
Private Sub MyTextBox_Init(sender As Object, e As EventArgs) Handles Me.Init
If Page.IsPostBack Then
_myParam = ViewState("myParam")
End If
End Sub
Private Sub MyTextBox_PreRender(sender As Object, e As EventArgs) Handles Me.PreRender
ViewState("myParam") = _myParam
End Sub
End Class
プロパティに対して設定できる属性があるかどうかなど、本当に単純なものが欠けているに違いありません。
アップデート
@AVDが、ViewStateとInit / Loadステージについてほとんど手がかりがないことを指摘してくれたおかげで、ようやくすべてを理解できました。
時間がある場合(そして、主要なASP.NET作業を行っている場合は、時間を作る必要があります) 、@AVDが指摘したASP.NETのビューステートの理解に関するドキュメントをお読みください。それはたくさん説明します。
ただし、それが説明しなかったのは、コントロールを内に配置した<asp:Repeater>場合、すべてのルールをウィンドウの外に投げ出すこともできます...そしてそれはまさに私が経験した問題です。
結局、私がそれを機能させる方法は、リピーター内でコントロールを使用し、リピーターのハンドラー<asp:PlaceHolder>内にコントロールのインスタンスを作成し、次にコントロールを追加することでした...すべてセクション内で行われます(幸いなことに私はそれを行うことができます)。ItemDataBound<asp:PlaceHolder>Init
Andrewがこの前の質問で見つけたように、鶏/卵の状況に陥る可能性があります。そこでは、でコントロールを作成する必要がありますがInit、が必要になるまで、どのコントロールが必要かわかりませんLoad。
(私の元の質問の文脈では、それは絶対に正しいので、私はまだAVDの答えを正しいものにしました)。