ボタンがクリックされたときに「すべての」テキストボックスを一緒に非表示にする方法は? それらを1つずつ非表示にしないための短い方法はありますか?
gamma_textBox.Visible = false;
foreach(var tb in this.Controls.OfType<TextBox>()) tb.Visible = false;
ただし、これはコンテナ内を調べないことに注意してください。ただし、各子のControls
コレクションを列挙することにより、再帰的に行うことができます。この例は次のようになります。
public void HideChildTextBoxes(Control parent)
{
foreach(Control c in parent.Controls)
{
HideChildTextBoxes(c);
if(c is TextBox) c.Visible = false;
}
}
この一般的な再帰的な方法を使用できます。
private void ProcessAllControls<T>(Control rootControl, Action<T> action)where T:Control
{
foreach (T childControl in rootControl.Controls.OfType<T>())
{
action(childControl);
}
foreach (Control childControl in rootControl.Controls)
{
ProcessAllControls<T>(childControl, action);
}
}
次のように動作します。
ProcessAllControls<TextBox>(this, txt=> txt.Visible = false);
このメソッドは、特定のコンテナー コントロールのすべての子コントロールを再帰的に検索して、指定された型のコントロールを探します。次に、アクションを適用します (この場合は変更されますVisibility)
。
任意の種類のコントロールが必要な場合は、非ジェネリック オーバーロードを使用します。
public static void ProcessAllControls(Control rootControl, Action<Control> action)
{
foreach (Control childControl in rootControl.Controls)
{
ProcessAllControls(childControl, action);
action(childControl);
}
}
Winforms を使用している場合は、次のように実行できます。
for (int i = 0; i < this.Controls.Count; i++)
{
if (this.Controls[i].GetType().ToString() == "System.Windows.Forms.TextBox")
this.Controls[i].Visible = false;
}
それらをパネル (または他のコンテナー) に貼り付け、そのパネルの可視性を設定します。
すべてのテキストボックスをLIST(または配列)に入れてから、 for 反復を使用してそれらを非表示にすることができます。