1

Webフォームに関するすべてのことについて、私の完全な知識不足を示す時が来ましたが、ここに行きます. 私は Panel コントロールを拡張し、OnPreRender はその中にいくつかの追加コントロールを貼り付けています (簡単にするために 1 つのテキスト ボックスとしましょう)。ここからは、Panels Render メソッドに任せるだけです。

私が抱えている問題は、明らかにこのコントロールが再レンダリングされるたびに、OnPreRender メソッドでコーディングしている値を使用して、同じ TextBox をパネルに再度貼り付けることです。今では、実際に毎回パネルを再作成したくありません。

最初の読み込み時にテキスト ボックス コントロールを貼り付けて、コントロール/ビューステート キャッシュからリロードしたいと考えています。この場合、パネルに 1 つのテキスト ボックスを貼り付けるだけの例では、テキスト ボックスの値が変更され、ポストバックが発生した場合、その値を変更された値のままにしておきます。

本当に基本的な Web フォームのことは知っていますが、これまでカスタム コントロールを作成する必要はありませんでした。どんな助けでも感謝します。

クリス。

4

4 に答える 4

3

LoadViewState と ProcessPostBackData が呼び出されたときにそこにあるように、OnInit で子コントロール (テキスト ボックス) を (再) 作成する必要があります。

詳細については、サーバー コントロールのライフサイクルを参照してください。

于 2008-12-08T16:51:44.997 に答える
1

ASP.NET の動的コントロールは、特に Web フォームとページのライフサイクルに慣れていない場合は注意が必要です。動的制御を回避できる場合は、そうしてください。代わりに、controlName.Visible=false などのトリックを使用してください。

必要な場合は、この記事をお読みください。経験則として、ページ ライフ サイクルの早い段階でコントロールを追加し、ページ ライフ サイクルの後半でそれらを参照します。PreRender はほとんど最後の部分であり、コントロールを追加して使用する珍しい場所です。

于 2008-12-08T16:49:28.527 に答える
1

これが .Net のすべてのバージョンに当てはまるかどうかはわかりませんが (2.0 以降だと思います)、ライフサイクルの一部ではない CreateChildControls というメソッドがあります。基本的には、EnsureChildControls メソッドが呼び出されるたびに呼び出されます。デフォルトでは、ポストバックでない場合、PreRender の前に呼び出されます。したがって、基本的にコードは次のようになります。

public class SomeControl : WebControl, INamingContainer
{
  private TextBox someTextBox;

  protected override void CreateChildControls()
  {
    base.CreateChildControls();

    someTextBox= new TextBox();
    someTextBox.ID = "tbxMain";

    Controls.Add(textboxToCheck);
  }
}

ここで注意すべき点は、EnsureChildControls を呼び出さない限り、コントロールのパブリック プロパティが ViewState の読み込みによって満たされる前に、コントロールが存在することを 100% 確信できないということです。これは何を意味するのでしょうか?前のコードを参考にして、CssClass のプロパティを追加します。

public class SomeControl : WebControl, INamingContainer
{
  private TextBox someTextBox;

  protected override void CreateChildControls()
  {
    base.CreateChildControls();

    someTextBox= new TextBox();
    someTextBox.ID = "tbxMain";

    Controls.Add(textboxToCheck);
  }

  public String CssClass { get; set; }
}

CreateChildControls では、これは必要ありません。

someTextBox.CssClass = CssClass;

コントロールがまだ存在することを確認する方法がないためです。これを処理するには、いくつかの方法があります。

public String CssClass {get {EnsureChildControls(); someTextbox.CssClass を返します。}

 set
 { 
   EnsureChildControls();
   someTextbox.CssClass = value;
 }

この例では、EnsureChildControls を呼び出し (CreateChildControls メソッドでテキスト ボックスに CssValue を設定していると仮定)、テキスト ボックスを設定または取得しています。

もう 1 つの方法は、コントロールのパブリック プロパティに依存するものを OnPreRender メソッドに入れることです。

protected override void OnPreRender(EventArgs e)
{
  someTextbox.CssClass = CssClass;
}

したがって、ViewState の読み込み中にプロパティが既に満たされていることを心配する混乱を回避できます。

1 つのメモ:

INamingContainer の使用は重要な場合があります。基本的には、親の名前 (およびおそらくそれ以上) を ID に適用することにより、親コントロールのコントロールがページ上で一意の ID を持つようにするだけです。基本的に、親 ID が Parent で子コントロール ID が Child の場合、ID は Parent_Child として表示される可能性があります。これにより、ViewState でプロパティが正しく設定されない、またはまったく設定されないという問題が解決されます。

于 2008-12-08T17:11:46.097 に答える
0

ビューステートのサービスが必要な場合は、コード内でビューステート情報の復元を管理する必要があります。

ここでの良い例は、Microsoft によるこのView State の例です。コード サンプルで参照されている項目は他にもいくつかありますが、正しい道筋をたどることができます。

于 2008-12-08T16:48:43.740 に答える