WebSurfer's Home

トップ > Blog 1   |   Login
Filter by APML

再帰を使って FindControl

by WebSurfer 27. July 2010 22:01

先のポストで、特定のコントロールのオブジェクトを取得するには FindControl メソッドを使うと書きましたが、見つけられないケースがあります。

例えば、Wizard コントロールの FinishButton は、Wizard.FindControl メソッドでは見つかりません。

階層構造は以下のようになっていて、FinishButton は FinishNavigationTemplateContainer に含まれています。そこでなら FindControl メソッドで取得できますが、それより上位のコントロールからでは取得できません。

Wizard

WizardChildTable

TableRow

TableCell

FinishNavigationTemplateContainer

この例に限らず、FindControl メソッドでコントロールを見つけられないというケースは結構あると思います。そのあたりの詳しい理由は MSDN ライブラリの 方法: ID を使用してサーバー コントロールにアクセスする を見てください。

そのような場合で、かつ、名前つきコンテナーへの参照が取得できない場合は、上記の MSDN ライブラリの「名前付けコンテナーの内部にあるコントロールの検索」のセクションに書いてあるように、再帰によってコントロールを見つけるメソッドを自力で書いて使うのが確実だと思います。

以下のような感じです。

protected Control FindControlRecursive(Control root, string id)
{
  if (root.ID == id)
  {
    return root;
  }

  foreach (Control ctrl in root.Controls)
  {
    Control foundCtrl = FindControlRecursive(ctrl, id);
    if (foundCtrl != null)
    {
        return foundCtrl;
    }
  }
  return null;
}

Tags:

ASP.NET

About this blog

2010年5月にこのブログを立ち上げました。その後 ブログ2 を追加し、ここは ASP.NET 関係のトピックス、ブログ2はそれ以外のトピックスに分けました。

Calendar

<<  June 2021  >>
MoTuWeThFrSaSu
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

View posts in large calendar