private void CleanForm()
{
foreach (var c in this.Controls)
{
if (c is TextBox)
{
((TextBox)c).Text = String.Empty;
}
}
}
Diese Methode funktioniert nicht und die Steuerelemente werden nicht gelöscht. Es kompiliert gut, tut aber nichts.
Irgendwelche Ideen?
Ich mag Lambda :)
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);
}
Viel Glück!
Wir hatten vor einigen Wochen ein solches Problem. Wenn Sie einen Haltepunkt setzen und this.Controls
genau untersuchen, zeigt das Problem seine Natur: Sie müssen alle untergeordneten Steuerelemente erneut aufrufen.
Der Code könnte so aussehen:
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);
}
}
}
Wenn Sie anfangs ClearForm aufrufen, übergeben Sie diese oder Seite (ich gehe davon aus, dass es sich hierbei um "dieses" handelt).
Ihre Textfelder befinden sich wahrscheinlich in Panels oder anderen Containern und nicht direkt im Formular.
Sie müssen die Controls
-Auflistung jedes untergeordneten Steuerelements rekursiv durchlaufen.
Ich habe meine Erweiterungsmethode verbessert/korrigiert.
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();
}
}
}
}
Und dies zum Löschen aller Steuerelemente in Form wie Textfeld, Kontrollkästchen, RadioButton
sie können verschiedene Typen hinzufügen, die Sie möchten ..
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;
}
}
}
Vielleicht möchten Sie einen einfacheren und kürzeren Ansatz. Dadurch werden auch alle TextBoxen gelöscht. (Außer TextBoxen in Panel oder GroupBox).
foreach (TextBox textBox in Controls.OfType<TextBox>())
textBox.Text = "";
groupBoxName.Controls.OfType<TextBox>().ToList().ForEach(t => t.Clear());
Versuche dies:
var t = Form.Controls.OfType<TextBox>().AsEnumerable<TextBox>();
foreach (TextBox item in t)
{
item.Text = "";
}
Sie können diesen Code ausprobieren
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if(keyData==Keys.C)
{
RefreshControl();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}