2

プログラムでフォームにいくつかのテキスト ボックスを作成していますが、後で FindControl を使用して参照する必要があります。

それらを作成するコードの後に​​、ページ読み込みメソッドに FindControl 命令を配置しましたが、エラーが発生します。

オブジェクト参照がオブジェクト インスタンスに設定されていません。

これは、ライフサイクルの後半までテキスト ボックス コントロールが作成されないため、Page_Load 内から参照できないためだと思います。

コード ビハインドのどこに FindControl 命令を配置して、プログラムで作成されたテキスト ボックスを見つけられるようにする必要があるか教えてもらえますか?

4

6 に答える 6

3

パネルやグリッドなどの別のコントロール内にテキスト ボックス コントロールを配置しましたか? その場合、ページ上のすべてのコントロールを再帰的に検索する必要があります。

再帰的な FindControl 実装の例を次に示します: Recursive Page.FindControl。「再帰的findcontrol」をグーグルで検索すると、他にも多くの例を見つけることができます。

于 2008-10-10T16:34:08.820 に答える
2

プログラムでテキストボックスを作成すると、それを直接使用して操作できます。FindControl は必要ありません (これも遅くなります)

TextBox txt = new TextBox();
...
txt.Text = "Text";

別の方法でアクセスする必要がある場合は、txt をクラスのプライベート変数にするだけです。

本当に FindControl を使用する必要がある場合、関数を呼び出したときにページに追加された (ページのコントロール リストに追加された) テキスト ボックスはありますか?

于 2008-10-10T09:20:55.743 に答える
1

Steele Priceのブログ投稿からこの関数を見つけたところ、完全に機能しました。マスターページのあるページ内でユーザーコントロールを参照しようとしましたが、これ以外に何も試しませんでした。コアクラスの 1 つに入れます。詳細については、 Steele のブログ投稿を参照してください。

これをクラスに入れる場合、次のようなコントロール参照を取得する必要があります。

Dim imgStep2PreviewIcon As Image = Eyespike.Utilities.FindControl(Of Control)(Page, "imgStep1PreviewIcon")
imgStep2PreviewIcon.Visible = False

VB.NET コード

Public Shadows Function FindControl(ByVal id As String) As Control
    Return FindControl(Of Control)(Page, id)
End Function

Public Shared Shadows Function FindControl(Of T As Control)(ByVal startingControl As Control, ByVal id As String) As T
    Dim found As Control = startingControl
    If (String.IsNullOrEmpty(id) OrElse (found Is Nothing)) Then Return CType(Nothing, T)
    If String.Compare(id, found.ID) = 0 Then Return found
    For Each ctl As Control In startingControl.Controls
        found = FindControl(Of Control)(ctl, id)
        If (found IsNot Nothing) Then Return found
    Next
    Return CType(Nothing, T)
End Function

C# (未テスト、converter.telerik.comを使用して生成)

public new Control FindControl(string id)
{
    return FindControl<Control>(Page, id);
}

public static new T FindControl<T>(Control startingControl, string id) where T : Control
{
    Control found = startingControl;
    if ((string.IsNullOrEmpty(id) || (found == null))) return (T)null; 
    if (string.Compare(id, found.ID) == 0) return found; 
    foreach (Control ctl in startingControl.Controls) {
        found = FindControl<Control>(ctl, id);
        if ((found != null)) return found; 
    }
    return (T)null;
}
于 2008-10-26T06:28:21.023 に答える
1

ページの読み込み時には、すべてのコントロールがセットアップされ、使用できるようになっている必要があります。コントロールは初期化され、ロード フェーズの前にある初期化フェーズ中に行われます。

最初にコントロールを見つけるコードを確認することをお勧めします。たとえば、コントロールが他のコントロール内にネストされている場合は、再帰的に検索するか、正しいコンテナー コントロールから検索する必要があります。

于 2008-10-10T11:06:13.190 に答える
1

CreateChildControls にテキスト ボックスを追加する場合は、それらにアクセスする前に、EnsureChildControls を呼び出す必要がある場合があります。

于 2008-10-10T11:06:44.047 に答える
0

OnInit オーバーライド中に (base.OnInit(e) を呼び出す前に) TextBox コントロールを作成すると、Page.OnLoad および関連するイベント中に使用できるようになります。また、それらを ViewState オブジェクト グラフの正しい位置に配置します。これは、ポスト バックや特にサーバー側の検証を処理するのに非常に役立ちます。

于 2008-10-10T11:01:03.590 に答える