1

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の答えを正しいものにしました)。

4

1 に答える 1

1

プロパティアクセサ内でViewStateとの間で値を保存/取得する必要があります。

Public Property MyParam As String
    Get
       If IsNothing(ViewState("myParam")) Then
           return string.Empty
       End IF
       Return ViewState("myParam").ToString()
    End Get
    Set(value As String)
        ViewState("myParam") = value
    End Set
End Property
于 2012-06-25T13:03:37.980 に答える