FindControl

.NET Frameworkにおいて、System.Web.UI名前空間には実装されているメソッドだが、System.Windows.Forms名前空間にはどうして無いのだ? と最初は思っていたのが表題のメソッドだ。欲しかったのは基点となるコンテナコントロール(フォーム含む)から、任意の名前のコントロールを検索して参照を返す機能。そこで、以下のような簡単なメソッドを書いてユーティリティとして使っていたが、

//コントロール配列は考慮しない
public static Control FindControl(string controlName, Control parentControl)
{
    if (parentControl.Controls.ContainsKey(controlName))
    {
        return parentControl.Controls[controlName];
    }
    else
    {
        if (parentControl.HasChildren)
        {
            Control result = null;
            foreach (Control child in parentControl.Controls)
            {
                result = FindControl(controlName, child);
                if (result != null) return result;
            }
            return result;
        }
        else
        {
            return null;
        }
    }
}

ところが、System.Windows.Forms.ControlクラスのControlsプロパティには、こんなメソッドがあるではないか!! 今日まで気がつかなったよ !!

Control.ControlCollection.Find メソッド 
                                                                            • -
コントロールの Name プロパティに基づいてコントロールを検索し、一致するすべてのコントロールの配列を構築します。
                                                                          • -
public Control[] Find (string key, bool searchAllChildren)

全然知らなかった。なにも知らないで上のメソッドをずっと使っていたが、これは恥ずかしいかもしれない。