by WebSurfer
2010年7月27日 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;
}