Как очистить текст всех текстовых полей в форме?
private void CleanForm()
{
foreach (var c in this.Controls)
{
if (c is TextBox)
{
((TextBox)c).Text = String.Empty;
}
}
}
Этот метод выше не работает, и элементы управления не очищаются. Он компилируется отлично, но ничего не делает.
Любые идеи?
Ответы
Ответ 1
Мне нравится 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);
}
Удачи!
Ответ 2
У нас была проблема вроде этого несколько недель назад. Если вы установите точку останова и внимательно рассмотрите 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);
}
}
Ответ 3
Ваши текстовые поля, вероятно, находятся внутри панелей или других контейнеров, а не непосредственно внутри формы.
Вам необходимо рекурсивно пройти коллекцию Controls
каждого дочернего элемента управления.
Ответ 4
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').
Ответ 5
Я улучшил/исправил свой метод расширения.
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();
}
}
}
}
Ответ 6
И это для очистки всех элементов управления в виде текстового поля, флажка, 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;
}
}
}
Ответ 7
Попробуйте следующее:
var t = Form.Controls.OfType<TextBox>().AsEnumerable<TextBox>();
foreach (TextBox item in t)
{
item.Text = "";
}
Ответ 8
Возможно, вам нужен более простой и короткий подход. Это также очистит все текстовые поля. (За исключением текстовых полей внутри Panel или GroupBox).
foreach (TextBox textBox in Controls.OfType<TextBox>())
textBox.Text = "";
Ответ 9
Вы можете попробовать этот код
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if(keyData==Keys.C)
{
RefreshControl();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
Ответ 10
groupBoxName.Controls.OfType<TextBox>().ToList().ForEach(t => t.Clear());
Ответ 11
Просто используйте
private void button2_Click(object sender, EventArgs e)
{
textBox1.Text = "";
}