特定の種類の Windows フォーム (ボタン/テキスト ボックス) のすべての子コントロールを取得するにはどうすればよいでしょうか? 質問する

特定の種類の Windows フォーム (ボタン/テキスト ボックス) のすべての子コントロールを取得するにはどうすればよいでしょうか? 質問する

フォーム上のタイプ x のすべてのコントロールを取得する必要があります。以前、次のようなコードを見たことがあると思います。

dim ctrls() as Control
ctrls = Me.Controls(GetType(TextBox))

再帰関数を使用してすべてのコントロールを反復処理し、子を取得できることはわかっていますが、次のような、より簡単でわかりやすい方法はありますか?

Dim Ctrls = From ctrl In Me.Controls Where ctrl.GetType Is Textbox

ベストアンサー1

もう一つのオプションがあります。サンプル アプリケーションを作成してテストし、最初の GroupBox 内に GroupBox と GroupBox を配置しました。ネストされた GroupBox 内に 3 つの TextBox コントロールとボタンを配置しました。これは私が使用したコードです (探していた再帰も含まれています)

public IEnumerable<Control> GetAll(Control control,Type type)
{
    var controls = control.Controls.Cast<Control>();

    return controls.SelectMany(ctrl => GetAll(ctrl,type))
                              .Concat(controls)
                              .Where(c => c.GetType() == type);
}

フォームのロードイベントでテストするために、最初のGroupBox内のすべてのコントロールの数を知りたいと思いました。

private void Form1_Load(object sender, EventArgs e)
{
    var c = GetAll(this,typeof(TextBox));
    MessageBox.Show("Total Controls: " + c.Count());
}

そして、毎回適切なカウントが返されたので、これはあなたが探しているものに完璧に機能すると思います :)

おすすめ記事