private void CleanForm()
{
foreach (var c in this.Controls)
{
if (c is TextBox)
{
((TextBox)c).Text = String.Empty;
}
}
}
上記のこの方法は機能せず、コントロールはクリアされません。それはうまくコンパイルされますが、何もしません。
何か案は?
私はラムダが好きです:)
private void ClearTextBoxes()
{
Action<Control.ControlCollection> func = null;
func = (controls) =>
{
foreach (Control control in controls)
if (control is TextBox)
(control as TextBox).Clear();
else
func(control.Controls);
};
func(Controls);
}
幸運を!
数週間前にこのような問題が発生しました。ブレークポイントを設定し、this.Controls
を詳細に調べると、問題がその性質を明らかにします。すべての子コントロールを再帰処理する必要があります。
コードは次のようになります。
private void CleanForm()
{
traverseControlsAndSetTextEmpty(this);
}
private void traverseControlsAndSetTextEmpty(Control control)
{
foreach(var c in control.Controls)
{
if (c is TextBox) ((TextBox)c).Text = String.Empty;
traverseControlsAndSetTextEmpty(c);
}
}
private void CleanForm(Control ctrl)
{
foreach (var c in ctrl.Controls)
{
if (c is TextBox)
{
((TextBox)c).Text = String.Empty;
}
if( c.Controls.Count > 0)
{
CleanForm(c);
}
}
}
最初にClearFormを呼び出すとき、thisまたはPageを渡します(これが 'this'であると仮定します)。
テキストボックスはおそらくパネルや他のコンテナ内にあり、フォーム内に直接ではありません。
すべての子コントロールのControls
コレクションを再帰的に走査する必要があります。
拡張方法を改善/修正しました。
public static class ControlsExtensions
{
public static void ClearControls(this Control frm)
{
foreach (Control control in frm.Controls)
{
if (control is TextBox)
{
control.ResetText();
}
if (control.Controls.Count > 0)
{
control.ClearControls();
}
}
}
}
そしてこれは、textbox、checkbox、radioButtonのようなフォームのすべてのコントロールをクリアするためのものです
さまざまなタイプを追加できます。
private void ClearTextBoxes(Control control)
{
foreach (Control c in control.Controls)
{
if (c is TextBox)
{
((TextBox)c).Clear();
}
if (c.HasChildren)
{
ClearTextBoxes(c);
}
if (c is CheckBox)
{
((CheckBox)c).Checked = false;
}
if (c is RadioButton)
{
((RadioButton)c).Checked = false;
}
}
}
よりシンプルで短いアプローチが必要な場合があります。これにより、すべてのTextBoxもクリアされます。 (PanelまたはGroupBox内のTextBoxを除く)。
foreach (TextBox textBox in Controls.OfType<TextBox>())
textBox.Text = "";
groupBoxName.Controls.OfType<TextBox>().ToList().ForEach(t => t.Clear());
これを試して:
var t = Form.Controls.OfType<TextBox>().AsEnumerable<TextBox>();
foreach (TextBox item in t)
{
item.Text = "";
}
このコードを試すことができます
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if(keyData==Keys.C)
{
RefreshControl();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}