0

私は非常にシンプルなユーザーコントロールを持っています。基本的にはテキストボックスとラベルで、その目的は相互に切り替えることです。コントロールは、ページの中にバインドされますPage_Load event。UserControlのPage_Loadイベントで、Toggle()関数を呼び出します。この関数は、適切なコントロールを表示または非表示にし、ブール値のEditableプロパティと文字列Textプロパティにそれぞれ基づいてテキストを設定します。

これが私のToggle()メソッドです(EditableとTextはパブリックプロパティであることを思い出してください):

Public Sub Toggle()
    If Editable Then
        txtText.Visible = True
        lblText.Visible = False
        txtText.Text = Text
        txtText.CssClass = TextboxCSSClass
    Else
        txtText.Visible = False
        lblText.Visible = True
        lblText.Text = Text
        lblText.CssClass = LabelCSSClass
    End If
End Sub

私の問題も単純です。ページ上のボタンがコントロールのToggle()メソッドを呼び出すと、トグルは正常に機能しますが、テキストは消えます。横にある通常のバインドされていないテキストボックスでこれを試しましたが、テキストボックスはテキスト値を適切に維持します。足りないものはありますか?

よろしくお願いします。

4

3 に答える 3

0

コントロールのvisibleプロパティをFalseに設定すると、Htmlでレンダリングされないため、ページ間で状態を保持できません。代わりに、MultiViewコントロールの使用を検討してください

于 2009-03-31T05:04:21.623 に答える
0

更新:コメントに関する詳細情報。

ビューステートを無効にしていて、テキスト ボックスのテキストを設定している場合、テキストは入力コントロール内のものです。これは、特定のテキスト ボックスの値が変更されたかどうかを知りたいときに、まれなシナリオで影響を与える可能性があります。

ラベルは入力コントロールではないため、上記はラベルとは異なります。ビューステートを無効にして、リクエストごとにテキストを設定しないと、初期値が表示されます (試してみてください)。ビューステートは、コントロールのポストバック間で情報を保持することを自動的に許可するものです。

ラベルで発生するのと同じように、ユーザー コントロールでも発生します。両方のコントロール テキストを直接設定するようにセッターを変更すると、viewstate を使用している場合は内部コントロールに値が保持されます。オフにすると、ラベルとテキストボックスの動作が異なります。

また、viewstate をオフにすると、Visible 構成にも影響することに注意してください。私はビューステートを頻繁にオフにしていますが、ポストバック全体でコントロール情報を保持したいシナリオがあるかもしれません。ビューステートをオフにするときは、!IsPostBack の場合だけでなく、常にコントロールを構成する必要があります。

Visible であるべきものとコード内のテキストを追跡している場合は、内部コントロールのビューステートをオフにできることに注意してください (他のプロパティをそれらに割り当てていないと仮定します)。


最初の答え:

Text プロパティの現在の値をラベル/テキスト ボックスに割り当てています。現在のリクエストで値を設定しなかった場合、デフォルト値が設定されているため、空のテキストが取得されます。

次のようにビューステートに値を保存できます (c# 構文):

public string Text
{
   get
   {
      return (string) ViewState["MyText"];
   }
   set
   {
      ViewState["MyText"] = value;
   }
}

Ps。これが唯一の方法ではありません。トグルがテキストを設定しなかったが、セッターで両方のコントロールに設定した場合、値は保持されます (ページの読み込みのように、ビューステートが追跡された後にユーザー コントロールの Text プロパティを割り当てる限り)。 )。

于 2009-03-31T15:45:49.193 に答える
0

私はそれを考え出した!ばかで申し訳ありません。私が間違っていたのは次のとおりです。テキスト プロパティの Get/Set がプライベート メンバーに格納されていました。これは、テキストボックスに接続されていないため、テキストが更新されたときに認識されなかったことを意味します。代わりに、次のことを行いました。

Public Property Text() As String
    Get
        Return txtText.Text
    End Get
    Set(ByVal value As String)
        txtText.Text = value
    End Set
End Property

そして私のPage_Loadイベントで:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not IsPostBack Then
        lblText.Text = Text
        Toggle()
    End If
End Sub

そして今、それはうまくいきます!私を正しい道に導いてくれた人々に感謝します!:)

于 2009-03-31T17:51:52.620 に答える