UserControl テキストボックスの状態が維持されない
-
22-08-2019 - |
質問
私は非常に単純なユーザーコントロールを持っています。基本的にはテキストボックスとラベルであり、その目的は相互に切り替えることです。コントロールはページの作成中にバインドされます。 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() メソッドを呼び出すと、切り替えは正常に機能しますが、テキストが消えます。通常の非バインドテキストボックスを隣に置いてこれを試してみましたが、テキストボックスはテキスト値をうまく維持します。何か足りないものはありますか?
事前にご協力いただきありがとうございます。
解決 2
私はそれを考え出しました!私は馬鹿であることをお詫び申し上げます。ここで私が間違って何をやっていたのです:不動産のプライベートメンバに格納されていたテキストのための私の取得/設定。これは、更新がテキストに行われたとき、それがテキストボックスに接続されていないので、それは、知らなかったことを意味します。代わりに、私は次のようでした。
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
今では正常に動作します!正しい道を私を置いているものに感謝! :)
他のヒント
、このように、それはページ間の状態を運ぶことができないHTMLでレンダリングされません。代わりに、
MultiViewコントロールを使用することを検討してくださいアップデート: コメントに関する詳細。
ビューステートを無効にし、テキストボックスのテキストを設定した場合、そのテキストは入力コントロール内のテキストになります。これは、特定のテキストボックスの値が変更されたかどうかを確認しようとする一般的なシナリオでは影響を受ける可能性があります。
ラベルは入力コントロールではないため、上記は異なります。ビューステートを無効にした場合、すべてのリクエストにテキストを設定しないと、初期値が表示されます (試してみてください)。ビューステートは、コントロールのポストバック間で情報を自動的に保持できるようにするものです。
ラベルで発生するのと同じように、ユーザー コントロールでも発生します。両方のコントロール テキストを直接設定するようにセッターを変更すると、ビューステートを使用している場合は内部コントロールの値が保持されます。これをオフにすると、ラベルとテキスト ボックスの動作が異なります。
また、ビューステートをオフにすると、Visible 構成にも影響することに注意してください。私はビューステートを頻繁にオフにしますが、ポストバック間でコントロール情報を保持したいシナリオがあるかもしれません。ビューステートをオフにするときは、!IsPostBack のときだけでなく、常にコントロールを設定する必要があります。
コード内の表示対象とテキストを追跡している場合は、内部コントロールのビューステートをオフにすることができることに注意してください (他のプロパティを割り当てていないことが前提です)。
最初の答え:
Text プロパティの現在の値をラベル/テキストボックスに割り当てています。現在のリクエストで値を設定しなかった場合は、デフォルト値が使用されるため、空のテキストが得られます。
値をビューステートに次のように保存できます (C# 構文)。
public string Text
{
get
{
return (string) ViewState["MyText"];
}
set
{
ViewState["MyText"] = value;
}
}
追伸これが唯一の方法ではありません。トグルでテキストが設定されなかったが、セッターで両方のコントロールに設定した場合、値は保持されます (ページの読み込みなど、ビューステートが追跡された後にユーザー コントロールの Text プロパティを割り当てている限り) )。