private void CleanForm()
{
foreach (var c in this.Controls)
{
if (c is TextBox)
{
((TextBox)c).Text = String.Empty;
}
}
}
Cette méthode ci-dessus ne fonctionne pas et les contrôles ne sont pas effacés. Il compile bien, mais ne fait rien.
Des idées?
J'aime 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);
}
Bonne chance!
Nous avons eu un problème comme celui-ci quelques semaines auparavant. Si vous définissez un point d'arrêt et examinez de plus près this.Controls
, le problème révèle sa nature: vous devez récidiver dans tous les contrôles enfants.
Le code pourrait ressembler à ceci:
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);
}
}
}
Lorsque vous appelez initialement ClearForm, transmettez ceci, ou Page (je suppose que c'est ce que c'est "ceci").
Vos zones de texte sont probablement à l'intérieur de panneaux ou d'autres conteneurs, et non directement à l'intérieur du formulaire.
Vous devez parcourir de manière récursive la collection Controls
de chaque contrôle enfant.
J'ai amélioré/corrigé ma méthode d'extension.
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();
}
}
}
}
Et ceci pour effacer tous les contrôles dans le formulaire
vous pouvez ajouter différents types que vous voulez ..
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;
}
}
}
Vous voulez peut-être une approche plus simple et plus courte. Cela effacera également toutes les TextBox. (Sauf les TextBox dans Panel ou GroupBox).
foreach (TextBox textBox in Controls.OfType<TextBox>())
textBox.Text = "";
groupBoxName.Controls.OfType<TextBox>().ToList().ForEach(t => t.Clear());
Essaye ça:
var t = Form.Controls.OfType<TextBox>().AsEnumerable<TextBox>();
foreach (TextBox item in t)
{
item.Text = "";
}
Vous pouvez essayer ce code
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if(keyData==Keys.C)
{
RefreshControl();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}