1. ホーム
  2. c#

[解決済み] Windowsフォームの特定のタイプ(ボタン/テキストボックス)の子コントロールをすべて取得する方法は?

2022-07-04 16:55:03

質問

私は、フォーム上のタイプxのすべてのコントロールを取得する必要があります。私は過去に一度、このようなものを使用するコードを見たことがあると確信しています。

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

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

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

どのように解決するのですか?

ここにあなたのための別のオプションがあります。私はサンプルアプリケーションを作成することによってそれをテストし、私はその後、最初の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());
}

そして、それは毎回適切なカウントを返しました。)