1

内部にマークアップを格納できる WebControl を作成し、独自の子コントロールを動的に作成しようとしています。私が抱えている問題は、作成した子コントロールとは別に、マークアップに格納されたコントロール (以下の例を参照) を (まだ) レンダリングできないことです。

これらの 2 つのフラグを使用してクラスを設定する必要があることは承知しています。

[ParseChildren(false)]
[PersistChildren(true)]
public class OuterControl : WebControl
{
  ...
}

サンプルのマークアップは次のようになります。

<custom:OuterControl>
  <asp:TextBox ...>
<custom:OuterControl>

RenderContents()内には、コントロール ツリーに追加してレンダリングし、特定の部分でマークアップにラップされたものをレンダリングする必要があるいくつかのコントロールがあります。例えば:

protected override void RenderContents(HtmlTextWriter output)
{
  EnsureChildControls();
  [ Misc work, render my controls ]

  [** Would like to render wrapped children here **]

  [ Possibly other misc work ]
}

前述のように、コードで作成したコントロールをRenderChildren()の呼び出しから 2 回レンダリングするか、その行を削除してラップされたコントロールをまったくレンダリングしないようにすることができます。ダーン。

考え?

4

1 に答える 1

1

同様の要件 (提供されたコントロールの周りにコントロールの標準セットを構築する) があったとき、私は次のようなことをしました:

EnsureChildControls();

Control[] currentControls = new Control[Controls.Count];

if (HasControls()) {
  Controls.CopyTo(currentControls, 0);
  Controls.Clear();
}

// Misc work, add my controls, etc, e.g.
Panel contentBox = new Panel { ID = "Content", CssClass = "content_border" };
// at some point, add wrapped controls to a control collection
foreach (Control currentControl in currentControls) {
  contentBox.Controls.Add(currentControl);
}

// Finally, add new controls back into Control collection
Controls.Add(contentBox);

これは非常によく持ちこたえました。

于 2009-11-05T16:47:02.840 に答える